提交 f047460f 编写于 作者: W wizardforcel

2020-09-01 18:39:56

上级 563ae41c
......@@ -6,11 +6,11 @@
# 本书涵盖的内容
“TensorFlow 简介”讨论了 Google 的开源框架 TensorFlow,以及为什么它对深度学习很有用。 我们将讨论如何在 MAC,Windows 和 Ubuntu 上为 CPU 和 GPU 安装 TensorFlow。 我们还将讨论整本书中将使用的其他 python 软件包。 我们将解释 TensorFlow 代码的两个组成部分,图形的定义及其执行。 我们将学习使用 TensorBoard 查看图结构。 我们将了解 TensorFlow 常量,变量和占位符之间的区别。 我们还将品尝 TensorFlow 估器。
“TensorFlow 简介”讨论了 Google 的开源框架 TensorFlow,以及为什么它对深度学习很有用。 我们将讨论如何在 MAC,Windows 和 Ubuntu 上为 CPU 和 GPU 安装 TensorFlow。 我们还将讨论整本书中将使用的其他 python 软件包。 我们将解释 TensorFlow 代码的两个组成部分,图形的定义及其执行。 我们将学习使用 TensorBoard 查看图结构。 我们将了解 TensorFlow 常量,变量和占位符之间的区别。 我们还将品尝 TensorFlow 估器。
“回归”讨论了回归及其应用。 我们将讨论回归所涉及的概念,了解回归与聚类和分类的不同之处。 我们将学习可能的不同类型的损失函数以及如何在 Tensorflow 中实现它们。 我们学习如何实现 L1 和 L2 正则化。 我们将讨论梯度下降算法,学习如何优化它并在 Tensorflow 中实现它。 我们将简要了解交叉熵函数及其实现。
“神经网络感知器”,涵盖了人工神经网络,并解释了为什么它可以完成 DNN 最近声称的出色任务。 我们将学习激活函数的不同选择。 我们将使用所有这些来构建一个简单的感知器,并将其用于功能建模。 我们将在训练之前了解数据的正则化。 我们还将学习逐步构建多层感知器(MLP)。 我们将看到 TensorFlow 的自动区分器如何使我们的工作更轻松。
“神经网络感知机”,涵盖了人工神经网络,并解释了为什么它可以完成 DNN 最近声称的出色任务。 我们将学习激活函数的不同选择。 我们将使用所有这些来构建一个简单的感知机,并将其用于功能建模。 我们将在训练之前了解数据的正则化。 我们还将学习逐步构建多层感知机(MLP)。 我们将看到 TensorFlow 的自动区分器如何使我们的工作更轻松。
“TensorFlow 卷积神经网络”,讨论了卷积的过程及其如何提取特征。 我们将学习 CNN 的三个重要层:卷积层,池化层和完全连接层。 我们还将学习辍学,如何提高性能以及不同的 CNN 架构(例如 LeNET 和 GoogleNET)。
......
......@@ -993,7 +993,7 @@ sess.close()
# 将 TensorFlow 用于深度学习
今天的 DNN 是 AI 社区的流行语。 使用 DNN 的候选人最近赢得了许多数据科学/凝视竞赛。 自 1962 年 Rosenblat 提出感知以来,就一直使用 DNN 的概念,而 1986 年 Rumelhart,Hinton 和 Williams 发明了梯度下降算法后,DNN 就变得可行了。 直到最近,DNN 才成为 AI/ML 爱好者和全世界工程师的最爱。
今天的 DNN 是 AI 社区的流行语。 使用 DNN 的候选人最近赢得了许多数据科学/凝视竞赛。 自 1962 年 Rosenblat 提出感知以来,就一直使用 DNN 的概念,而 1986 年 Rumelhart,Hinton 和 Williams 发明了梯度下降算法后,DNN 就变得可行了。 直到最近,DNN 才成为 AI/ML 爱好者和全世界工程师的最爱。
造成这种情况的主要原因是现代计算功能的可用性,例如 GPU 和 TensorFlow 之类的工具,这些功能使只需几行代码即可更轻松地访问 GPU 并构建复杂的神经网络。
......@@ -1100,13 +1100,13 @@ with tf.Session as sess:
...
```
6. **评估模型**:训练完网络后,我们将使用`predict()`对验证数据和测试数据进行评估。 通过评估,我们可以估出模型对数据集的拟合程度。 因此,我们可以避免过度拟合或拟合不足的常见错误。 对模型满意后,便可以将其部署到生产中。
6. **评估模型**:训练完网络后,我们将使用`predict()`对验证数据和测试数据进行评估。 通过评估,我们可以估出模型对数据集的拟合程度。 因此,我们可以避免过度拟合或拟合不足的常见错误。 对模型满意后,便可以将其部署到生产中。
# 还有更多
在 TensorFlow 1.3 中,添加了一个称为 TensorFlow 估计器的新功能。 TensorFlow 估计器使创建神经网络模型的任务变得更加容易,它是一个高级 API,封装了训练,评估,预测和服务的过程。 它提供了使用预制估算器的选项,也可以编写自己的自定义估算器。 有了预制的估算器,就不再需要担心构建计算或创建会话,它就可以处理所有这些。
在 TensorFlow 1.3 中,添加了一个称为 TensorFlow 估计器的新功能。 TensorFlow 估计器使创建神经网络模型的任务变得更加容易,它是一个高级 API,封装了训练,评估,预测和服务的过程。 它提供了使用预制估计器的选项,也可以编写自己的自定义估计器。 有了预制的估计器,就不再需要担心构建计算或创建会话,它就可以处理所有这些。
目前,TensorFlow 估算器有六个预制的估算器。 使用 TensorFlow 预制的估计器的另一个优势是,它本身也可以创建可在 TensorBoard 上可视化的摘要。 有关估算器的更多详细信息,请访问[这里](https://www.tensorflow.org/programmers_guide/estimators)
目前,TensorFlow 估计器有六个预制的估计器。 使用 TensorFlow 预制的估计器的另一个优势是,它本身也可以创建可在 TensorBoard 上可视化的摘要。 有关估计器的更多详细信息,请访问[这里](https://www.tensorflow.org/programmers_guide/estimators)
# 基于 DNN 的问题所需的不同 Python 软件包
......
......@@ -5,8 +5,8 @@
* 选择损失函数
* TensorFlow 中的优化器
* 从 CSV 文件读取和预处理数据
* 房价估-简单线性回归
* 房价估-多元线性回归
* 房价估-简单线性回归
* 房价估-多元线性回归
* MNIST 数据集上的逻辑回归
# 介绍
......@@ -21,7 +21,7 @@
![](img/5f56fc4e-0ef5-4339-8a40-6728f006267c.png)
在这里,`X = (x[1], x[2], ..., x[n])``n`个输入变量和`W = (w[1], w[2], ... w[n])`是线性系数,以`b`为偏差项。 目标是找到系数`W`的最佳估计,以使预测`Y`的误差最小。 线性系数`W`使用最小二乘法估,即最小化预测值(`Y_hat`)和值(`Y`)之间的平方差之和。因此,我们尝试最小化*损失*函数:
在这里,`X = (x[1], x[2], ..., x[n])``n`个输入变量和`W = (w[1], w[2], ... w[n])`是线性系数,以`b`为偏差项。 目标是找到系数`W`的最佳估计,以使预测`Y`的误差最小。 线性系数`W`使用最小二乘法估,即最小化预测值(`Y_hat`)和值(`Y`)之间的平方差之和。因此,我们尝试最小化*损失*函数:
![](img/989fcbf6-aa62-4d79-9313-d27833b11e02.png)
......@@ -198,7 +198,7 @@ with tf.Session() as sess:
5. 馈送到`feed_dict``X``Y`数据可以是单个`X``Y`点(随机梯度),整个训练集(普通)或批次。
6. 梯度下降的另一个变化是增加了动量项(我们将在第 3 章“神经网络感知”中找到更多相关信息)。 为此,我们使用优化器`tf.train.MomentumOptimizer()`。 它同时将`learning_rate``momentum`作为`init`参数:
6. 梯度下降的另一个变化是增加了动量项(我们将在第 3 章“神经网络感知”中找到更多相关信息)。 为此,我们使用优化器`tf.train.MomentumOptimizer()`。 它同时将`learning_rate``momentum`作为`init`参数:
```py
optimizer = tf.train.MomentumOtimizer(learning_rate=0.01, momentum=0.5).minimize(loss)
......@@ -386,7 +386,7 @@ data = tf.where(condition, tf.zeros(NUM_FEATURES), data[:])
在这里,我们首先定义一个张量布尔条件,如果`MEDV`等于`50.0`,则为真。 然后,如果条件为真,则使用 TensorFlow `tf.where()`操作分配全零。
# 房价估算-简单线性回归
# 房价估计 -- 简单线性回归
在此配方中,我们将基于波士顿房价数据集上的房间数(`RM`)执行简单的线性回归。
......@@ -528,7 +528,7 @@ plt.show()
好吧,我们执行了简单的线性回归,但是如何找出模型的性能呢? 有多种方法可以做到这一点。 从统计上讲,我们可以计算 R 方或将我们的数据分为训练和交叉验证集,并检查验证集的准确性(损失项)。
# 房价估算-多元线性回归
# 房价估计 -- 多元线性回归
我们可以通过对权重和占位符的声明进行一些修改来对同一数据进行多元线性回归。 在多重线性回归的情况下,由于每个要素都有不同的值范围,因此规范化必不可少。 这是使用所有 13 种输入功能对波士顿房价数据集进行多元线性回归的代码。
......
# 三、神经网络:感知
# 三、神经网络:感知
自最近十年以来,神经网络一直处于机器学习研究和应用的最前沿。 **深层神经网络****DNN**),传递学习以及计算效率高的 GPU 的可用性已帮助在图像识别,语音识别甚至文本生成领域取得了重大进展。 在本章中,我们将专注于基本的神经网络感知,即人工神经元的完全连接的分层体系结构。 本章将包括以下食谱:
自最近十年以来,神经网络一直处于机器学习研究和应用的最前沿。 **深层神经网络****DNN**),传递学习以及计算效率高的 GPU 的可用性已帮助在图像识别,语音识别甚至文本生成领域取得了重大进展。 在本章中,我们将专注于基本的神经网络感知,即人工神经元的完全连接的分层体系结构。 本章将包括以下食谱:
* 激活函数
* 单层感知
* 单层感知
* 反向传播算法的梯度计算
* 使用 MLP 的 MNIST 分类器
* 使用 MLP 进行函数逼近-预测波士顿房价
......@@ -18,7 +18,7 @@
从那时起,众所周知,添加多层神经元并建立一个深而密集的网络将有助于神经网络解决复杂的任务。 正如母亲为孩子的成就感到自豪一样,科学家和工程师对使用[**神经网络**(**NN**)](https://www.youtube.com/watch?v=jPHUlQiwD9Y)。 这些声明不是虚假的,但是由于硬件计算的限制和复杂的网络结构,当时根本不可能实现它们。 这导致了 1970 年代和 1980 年代的 **AI 寒冬**。 在这些寒战中,由于很少或几乎没有对基于 AI 的项目提供资金,因此该领域的进展放缓了。
随着 DNN 和 GPU 的出现,情况发生了变化。 今天,我们拥有的网络可以在较少的调整参数的情况下实现更好的性能,诸如辍学和移学习之类的技术可以进一步减少训练时间,最后,硬件公司正在提出专门的硬件芯片来执行基于 NN 的快速计算。
随着 DNN 和 GPU 的出现,情况发生了变化。 今天,我们拥有的网络可以在较少的调整参数的情况下实现更好的性能,诸如辍学和移学习之类的技术可以进一步减少训练时间,最后,硬件公司正在提出专门的硬件芯片来执行基于 NN 的快速计算。
人工神经元是所有神经网络的核心。 它由两个主要部分组成-加法器(对加权后的神经元的所有输入求和),以及处理单元,对加权后的总和进行加权,并基于称为**激活函数**的预定义函数生成输出。 。 每个人工神经元都有其自己的一组权重和阈值(偏差)。 它通过不同的学习算法来学习这些权重和阈值:
......@@ -26,19 +26,19 @@
[来源](https://commons.wikimedia.org/wiki/File:Rosenblattperceptron.png)
当仅存在此类神经元的一层时,它称为感知器。 输入层称为**第零层**,因为它仅缓冲输入。 存在的唯一神经元层形成输出层。 输出层的每个神经元都有自己的权重和阈值。 当存在许多这样的层时,该网络称为**多层感知器****MLP**)。 一个 MLP 具有一个或多个隐藏层。 这些隐藏层具有不同数量的隐藏神经元。 每个隐藏层的神经元具有相同的激活函数:
当仅存在此类神经元的一层时,它称为感知机。 输入层称为**第零层**,因为它仅缓冲输入。 存在的唯一神经元层形成输出层。 输出层的每个神经元都有自己的权重和阈值。 当存在许多这样的层时,该网络称为**多层感知机****MLP**)。 一个 MLP 具有一个或多个隐藏层。 这些隐藏层具有不同数量的隐藏神经元。 每个隐藏层的神经元具有相同的激活函数:
![](img/aa3bbbc4-cb14-4d86-bae9-70156e72a876.png)
上图显示了一个 MLP,它具有四个输入,五个隐藏层,每个隐藏层分别具有 4、5、6、4 和 3 个神经元,而在输出层中具有三个神经元。 在 MLP 中,下层的所有神经元都与其上一层的所有神经元相连。 因此,MLP 也称为**全连接层**。 MLP 中的信息流始终是从输入到输出。 由于没有反馈或跳跃,因此这些网络也称为**前馈网络**
使用**梯度下降算法**训练感知器。 在第 2 章“回归”中,您了解了梯度下降; 在这里,我们对其进行更深入的研究。 感知器通过有监督的学习算法进行学习,也就是说,网络由训练数据集中存在的所有输入的期望输出提供。 在输出中,我们定义一个误差函数或目标函数`J(W)`,这样,当网络完全学习了所有训练数据时,目标函数将最小。
使用**梯度下降算法**训练感知机。 在第 2 章“回归”中,您了解了梯度下降; 在这里,我们对其进行更深入的研究。 感知机通过有监督的学习算法进行学习,也就是说,网络由训练数据集中存在的所有输入的期望输出提供。 在输出中,我们定义一个误差函数或目标函数`J(W)`,这样,当网络完全学习了所有训练数据时,目标函数将最小。
更新输出层和隐藏层的权重,以使目标函数的梯度减小:
![](img/07dc4ed4-a2e2-4b9f-aec8-8a12b52508af.png)
为了更好地理解它,请对山丘,高原和坑坑洼洼的景观进行可视化处理。 目的是扎根(目标函数的全局最小值)。 如果您站在山顶上而必须下山,那么很明显的选择是,您将沿着山下坡,即向负坡度(或负坡度)移动。 以相同的方式,感知中的权重与目标函数的梯度的负值成比例地变化。
为了更好地理解它,请对山丘,高原和坑坑洼洼的景观进行可视化处理。 目的是扎根(目标函数的全局最小值)。 如果您站在山顶上而必须下山,那么很明显的选择是,您将沿着山下坡,即向负坡度(或负坡度)移动。 以相同的方式,感知中的权重与目标函数的梯度的负值成比例地变化。
梯度值越高,权重值的变化越大,反之亦然。 现在,这一切都很好,但是当梯度达到零,因此权重没有变化时,我们到达高原时就会遇到问题。 当我们进入一个小坑(局部极小值)时,我们也可能遇到问题,因为当我们尝试移动到任一侧时,坡度将增加,从而迫使网络停留在坑中。
......@@ -46,7 +46,7 @@
TensorFlow 借助不同的优化器自动计算这些梯度。 但是,需要注意的重要一点是,由于 TensorFlow 将计算梯度,而梯度也将涉及激活函数的导数,因此重要的是,您选择的激活函数是可微的,并且在整个训练场景中最好具有非零梯度 。
感知梯度下降的主要方法之一不同于第 2 章,“回归”,应用是为输出层定义目标函数,但可用于查找目标层,以及隐藏层的神经元的权重变化。 这是使用**反向传播****BPN**)算法完成的,其中输出端的错误会向后传播到隐藏层,并用于确定权重变化。 您将很快了解更多信息。
感知梯度下降的主要方法之一不同于第 2 章,“回归”,应用是为输出层定义目标函数,但可用于查找目标层,以及隐藏层的神经元的权重变化。 这是使用**反向传播****BPN**)算法完成的,其中输出端的错误会向后传播到隐藏层,并用于确定权重变化。 您将很快了解更多信息。
# 激活函数
......@@ -197,7 +197,7 @@ with tf.Session() as sess:
以下是功能的说明:
* **门控激活函数**由 McCulloch Pitts Neuron 和初始感知使用。 它不可微且在`x = 0`处不连续。 因此,不可能使用此激活函数来使用梯度下降或其变体进行训练。
* **门控激活函数**由 McCulloch Pitts Neuron 和初始感知使用。 它不可微且在`x = 0`处不连续。 因此,不可能使用此激活函数来使用梯度下降或其变体进行训练。
* **Sigmoid 激活函数**曾经非常流行。 如果看曲线,它看起来像是阈值激活函数的连续版本。 它具有消失的梯度问题,即,函数的梯度在两个边缘附近变为零。 这使得训练和优化变得困难。
* **双曲正切激活函数**再次和 Sigmoid 类似,并具有非线性特性。 该函数以零为中心,并且与 Sigmoid 曲线相比具有更陡峭的导数。 像 Sigmoid 一样,这也遭受消失的梯度问题的困扰。
* **线性激活函数**顾名思义是线性的。 该函数从两侧都是无界的`[-inf, inf]`。 其线性是其主要问题。 线性函数的总和将是线性函数,线性函数的线性函数也将是线性函数。 因此,使用此功能,无法掌握复杂数据集中存在的非线性。
......@@ -213,13 +213,13 @@ with tf.Session() as sess:
* [该链接提供了 TensorFlow 中定义的激活函数及其使用方法的详细信息](https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/activation_functions_)
* [关于激活函数的不错总结](https://en.wikipedia.org/wiki/Activation_function)
# 单层感知
# 单层感知
简单的感知器是单层神经网络。 它使用阈值激活函数,并且正如 Marvin Minsky 论文所证明的那样,只能解决线性可分离的问题。 尽管这将单层感知器的应用限制为仅是线性可分离的问题,但看到它学习仍然总是令人惊奇。
简单的感知机是单层神经网络。 它使用阈值激活函数,并且正如 Marvin Minsky 论文所证明的那样,只能解决线性可分离的问题。 尽管这将单层感知机的应用限制为仅是线性可分离的问题,但看到它学习仍然总是令人惊奇。
# 准备
由于感知使用阈值激活函数,因此我们无法使用 TensorFlow 优化器来更新权重。 我们将不得不使用权重更新规则:
由于感知使用阈值激活函数,因此我们无法使用 TensorFlow 优化器来更新权重。 我们将不得不使用权重更新规则:
![](img/b9c0550a-5f1e-4f60-b618-58445d70c13b.png)
......@@ -227,7 +227,7 @@ with tf.Session() as sess:
# 操作步骤
这是我们处理单层感知的方法:
这是我们处理单层感知的方法:
1. 导入所需的模块:
......@@ -488,7 +488,7 @@ with tf.Session() as sess:
# 更多
我们的一个隐藏层多层感知在训练数据上的准确度为 84.45,在测试数据上的准确度为 92.1。 很好,但还不够好。 MNIST 数据库用作机器学习中分类问题的基准。 接下来,我们了解使用 TensorFlow 的内置优化器如何影响网络性能。
我们的一个隐藏层多层感知在训练数据上的准确度为 84.45,在测试数据上的准确度为 92.1。 很好,但还不够好。 MNIST 数据库用作机器学习中分类问题的基准。 接下来,我们了解使用 TensorFlow 的内置优化器如何影响网络性能。
# 另见
......@@ -609,7 +609,7 @@ import tensorflow as tf
![](img/d915165d-a180-4e7b-9fd9-552b65d2e667.png)
# 使用 MLP 预测波士顿房价的函数逼近
# 使用 MLP 预测波士顿房价的函数近似
[Hornik 等人的工作](http://www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.2016/notes/Sonia_Hornik.pdf)证明了以下:
......@@ -698,7 +698,7 @@ eta = 0.01
max_epoch = 1000
```
7. 创建具有一个隐藏层的多层感知模型:
7. 创建具有一个隐藏层的多层感知模型:
```py
def multilayer_perceptron(x):
......
......@@ -18,7 +18,7 @@ CNN 由许多神经网络层组成。 卷积和池化两种不同类型的层通
卷积网络背后有三个主要的直觉:**局部接受域****共享权重****池化**。 让我们一起回顾一下。
# 当地接受领
# 局部接受
如果我们要保留通常在图像中发现的空间信息,则使用像素矩阵表示每个图像会很方便。 然后,编码局部结构的一种简单方法是将相邻输入神经元的子矩阵连接到属于下一层的单个隐藏神经元中。 单个隐藏的神经元代表一个局部感受野。 请注意,此操作名为**卷积**,它为这种类型的网络提供了名称。
......@@ -26,11 +26,11 @@ CNN 由许多神经网络层组成。 卷积和池化两种不同类型的层通
让我们定义从一层到另一层的特征图。 当然,我们可以有多个可以从每个隐藏层中独立学习的特征图。 例如,我们可以从`28 x 28`个输入神经元开始处理 MNIST 图像,然后在下一个隐藏的区域中调用`k`个特征图,每个特征图的大小为`23 x 23`神经元(步幅为`5 x 5`)。
# 权重和偏
# 权重和偏
假设我们想通过获得独立于输入图像中放置同一特征的能力来摆脱原始像素表示的困扰。 一个简单的直觉是对隐藏层中的所有神经元使用相同的权重和偏差集。 这样,每一层将学习从图像派生的一组位置无关的潜在特征。
# 一个数学例子
# 一个数学示例
一种了解卷积的简单方法是考虑应用于矩阵的滑动窗口函数。 在下面的示例中,给定输入矩阵`I`和内核`K`,我们得到了卷积输出。 将`3 x 3`内核`K`(有时称为**过滤器****特征检测器**)与输入矩阵逐元素相乘,得到输出卷积矩阵中的一个单元格。 通过在`I`上滑动窗口即可获得所有其他单元格:
......@@ -44,7 +44,7 @@ CNN 由许多神经网络层组成。 卷积和池化两种不同类型的层通
过滤器的大小,步幅和填充类型是超参数,可以在网络训练期间进行微调。
# TensorFlow 中的 ConvNets
# TensorFlow 中的卷积网络
在 TensorFlow 中,如果要添加卷积层,我们将编写以下内容:
......@@ -101,7 +101,7 @@ tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
TensorFlow 实现了大量池化层,[可在线获取完整列表](https://www.tensorflow.org/api_guides/python/nn#Pooling)。简而言之,所有池化操作仅是对给定区域的汇总操作。
# ConvNets 摘要
# 卷积网络摘要
CNN 基本上是卷积的几层,具有非线性激活函数,并且池化层应用于结果。 每层应用不同的过滤器(数百或数千)。 要理解的主要观察结果是未预先分配滤波器,而是在训练阶段以最小化合适损失函数的方式来学习滤波器。 已经观察到,较低的层将学会检测基本特征,而较高的层将逐渐检测更复杂的特征,例如形状或面部。 请注意,得益于合并,后一层中的单个神经元可以看到更多的原始图像,因此它们能够组成在前几层中学习的基本特征。
......@@ -448,7 +448,7 @@ Jupyter 执行 CIFAR10 分类的示例
要安装 TFLearn,请参阅[《安装指南》](http://tflearn.org/installation),如果您想查看更多示例,可以在线获取[一长串久经考验的解决方案](http://tflearn.org/examples/)
# 使用 VGG19 传输样式以进行图像重绘
# 使用 VGG19 迁移样式用于图像重绘
在本食谱中,您将教计算机如何绘画。 关键思想是拥有绘画模型图像,神经网络可以从该图像推断绘画风格。 然后,此样式将转移到另一张图片,并相应地重新粉刷。 该食谱是对`log0`开发的代码的修改,[可以在线获取](https://github.com/log0/neural-style-painting/blob/master/TensorFlow%20Implementation%20of%20A%20Neural%20Algorithm%20of%20Artistic%20Style.ipynb)
......@@ -869,9 +869,9 @@ sess.run(tf.reduce_sum(mixed_image)))
通过 [deepart](https://deepart.io/) 网站,您可以播放自己的图像,并以自己喜欢的艺术家的风格重新绘制图片。 还提供了 Android 应用程序,iPhone 应用程序和 Web 应用程序。
# 使用预训练的 VGG16 网络进行迁移学习
# 将预训练的 VGG16 网络用于迁移学习
在本食谱中,我们将讨论移学习,这是一种非常强大的深度学习技术,在不同领域中都有许多应用程序。 直觉非常简单,可以用类推来解释。 假设您想学习一种新的语言,例如西班牙语,那么从另一种语言(例如英语)已经知道的内容开始可能会很有用。
在本食谱中,我们将讨论移学习,这是一种非常强大的深度学习技术,在不同领域中都有许多应用程序。 直觉非常简单,可以用类推来解释。 假设您想学习一种新的语言,例如西班牙语,那么从另一种语言(例如英语)已经知道的内容开始可能会很有用。
按照这种思路,计算机视觉研究人员现在通常使用经过预训练的 CNN 来生成新颖任务的表示形式,其中数据集可能不足以从头训练整个 CNN。 另一个常见的策略是采用经过预先训练的 ImageNet 网络,然后将整个网络微调到新颖的任务。 此处提出的示例的灵感来自 [Francois Chollet 在 Keras 的著名博客文章](https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)
......@@ -990,7 +990,7 @@ scores = model.predict_generator(validation_generator, nb_validation_samples/bat
标准的 VGG16 网络已经在整个 ImageNet 上进行了预训练,并具有从互联网下载的预先计算的权重。 然后,将该网络与也已单独训练的自定义网络并置。 然后,并列的网络作为一个整体进行了重新训练,使 VGG16 的 15 个较低层保持冻结。
这种组合非常有效。 通过对网络在 ImageNet 上学到的知识进行移学习,将其应用于我们的新特定领域,从而执行微调分类任务,它可以节省大量的计算能力,并重复使用已为 VGG16 执行的工作。
这种组合非常有效。 通过对网络在 ImageNet 上学到的知识进行移学习,将其应用于我们的新特定领域,从而执行微调分类任务,它可以节省大量的计算能力,并重复使用已为 VGG16 执行的工作。
# 更多
......
......@@ -6,7 +6,7 @@
* 检查 VGG 预制网络了解了哪些过滤器
* 使用 VGGNet,ResNet,Inception 和 Xception 对图像进行分类
* 回收预先构建的深度学习模型以提取特征
* 非常深的 Inception-v3 网络用于移学习
* 非常深的 Inception-v3 网络用于移学习
* 使用膨胀的 ConvNets,WaveNet 和 NSynth 生成音乐
* 回答有关图像的问题(可视化问答)
* 通过六种不同方式对视频进行预训练网络分类
......@@ -23,7 +23,7 @@
好吧,事实证明,在许多实际应用中,知道一个句子是否包含特定的基本单位(一个字符,一个单词或一个合计)是非常准确的信息,即使我们不记住句子中的确切位置也是如此。 基本单元位于。
# 创建用于情感分析的 ConvNet
# 创建用于情感分析的卷积网络
在本食谱中,我们将使用 TFLearn 创建基于 CNN 的情感分析深度学习网络。 如上一节所述,我们的 CNN 将是一维的。 我们将使用 IMDb 数据集,用于训练的 45,000 个高度受欢迎的电影评论和用于测试的 5,000 个集合。
......@@ -142,7 +142,7 @@ Training Step: 3519 | total loss: 0.09738 | time: 85.043s
* [《从头开始理解文本》](https://arxiv.org/abs/1502.01710)(张翔,Yann LeCun)。 本文演示了我们可以使用 CNN 将深度学习应用于从字符级输入到抽象文本概念的文本理解。 作者将 CNN 应用于各种大规模数据集,包括本体分类,情感分析和文本分类,并表明它们可以在不了解单词,词组,句子或任何其他句法或语义结构的情况下实现惊人的性能。 一种人类的语言。 这些模型适用于英文和中文。
# 检查 VGG 预网络了解了哪些过滤器
# 检查 VGG 预网络了解了哪些过滤器
在本食谱中,我们将使用 [keras-vis](https://raghakot.github.io/keras-vis/),这是一个外部 Keras 软件包,用于直观检查预建的 VGG16 网络从中学到了什么不同的过滤器。 这个想法是选择一个特定的 ImageNet 类别,并了解 VGG16 网络如何学会代表它。
......@@ -299,7 +299,7 @@ GitHub 上的 [keras-vis 存储库](https://github.com/raghakot/keras-vis)提供
[显着性地图的示例](https://github.com/raghakot/keras-vis)
# 使用 VGGNet,ResNet,Inception 和 Xception 对图像进行分类
# 将 VGGNet,ResNet,Inception 和 Xception 用于图像分类
图像分类是典型的深度学习应用程序。 由于 [ImageNet](http://image-net.org/) 图像数据库,该任务的兴趣有了最初的增长。 它按照 [WordNet](http://wordnet.princeton.edu/) 层次结构(目前仅是名词)来组织,其中每个节点都由成百上千的图像描绘。 更准确地说,ImageNet 旨在将图像标记和分类为将近 22,000 个单独的对象类别。 在深度学习的背景下,ImageNet 通常指的是 [ImageNet 大规模视觉识别挑战](http://www.image-net.org/challenges/LSVRC/),或简称 ILSVRC 中包含的工作。在这种情况下,目标是训练一个模型,该模型可以将输入图像分类为 1,000 个单独的对象类别。 在此配方中,我们将使用超过 120 万个训练图像,50,000 个验证图像和 100,000 个测试图像的预训练模型。
......@@ -321,7 +321,7 @@ ResNet 已在[《用于图像识别的深度残差学习》](https://arxiv.org/a
与 VGG 相比,ResNet 更深,但是模型的大小更小,因为使用了全局平均池化操作而不是全密层。
# 起始时间
# Inception
[《重新思考计算机视觉的初始架构》](https://arxiv.org/abs/1512.00567)(Christian Szegedy,Vincent Vanhoucke,Sergey Ioffe,Jonathon Shlens,Zbigniew Wojna,2015 年)中引入了 Inception 。关键思想是在同一模块中具有多种大小的卷积作为特征提取并计算`1×1``3×3``5×5`卷积。 这些滤波器的输出然后沿着通道尺寸堆叠,并发送到网络的下一层。 下图对此进行了描述:
......@@ -335,7 +335,7 @@ Xception 是 Inception 的扩展,在[《Xception:具有深度可分离卷积
# 准备
此食谱使用 Keras,因为该框架已预先完成了上述模块的实现。 Keras 首次使用时会自动下载每个网络的权重,并将这些权重存储在本地磁盘上。 换句话说,您不需要重新训练网络,而是可以利用互联网上已经可用的训练。 在您希望将网络分类为 1000 个预定义类别的假设下,这是正确的。 在下一个食谱中,我们将了解如何从这 1,000 个类别开始,并通过称为移学习的过程将它们扩展到自定义集合。
此食谱使用 Keras,因为该框架已预先完成了上述模块的实现。 Keras 首次使用时会自动下载每个网络的权重,并将这些权重存储在本地磁盘上。 换句话说,您不需要重新训练网络,而是可以利用互联网上已经可用的训练。 在您希望将网络分类为 1000 个预定义类别的假设下,这是正确的。 在下一个食谱中,我们将了解如何从这 1,000 个类别开始,并通过称为移学习的过程将它们扩展到自定义集合。
# 操作步骤
......@@ -650,7 +650,7 @@ AlexNet 是最早的堆叠式深层网络之一,它仅包含八层,前五层
* 较小的 CNN 需要较少的带宽才能将新模型从云导出到提供模型的位置。
* 较小的 CNN 在具有有限内存的 FPGA 和其他硬件上部署更可行。 为了提供所有这些优点,SqueezeNet 在​​论文 [SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size](https://arxiv.org/abs/1602.07360) 中提出。 SqueezeNet 通过减少 50 倍的参数在 ImageNet 上达到 AlexNet 级别的准确性。 此外,借助模型压缩技术,我们可以将 SqueezeNet 压缩到小于 0.5 MB(比 AlexNet 小 510 倍)。 Keras 将 SqueezeNet [作为单独的模块在线实现](https://github.com/DT42/squeezenet_demo)
# 回收预建的深度学习模型以提取特征
# 复用预建的深度学习模型来提取特征
在本食谱中,我们将看到如何使用深度学习来提取相关功能
......@@ -704,9 +704,9 @@ features = model.predict(x)
这具有多个优点。 首先,我们可以依靠公开提供的大规模训练,并将这种学习转移到新颖的领域。 其次,我们可以节省昂贵的大型训练时间。 第三,即使我们没有针对该领域的大量训练示例,我们也可以提供合理的解决方案。 对于手头的任务,我们也有一个很好的起始网络形状,而不是猜测它。
# 用于迁移学习的非常深的 InceptionV3 Net
# 用于迁移学习的非常深的 InceptionV3 网络
移学习是一种非常强大的深度学习技术,在不同领域中有更多应用。 直觉非常简单,可以用类推来解释。 假设您想学习一种新的语言,例如西班牙语,那么从另一种语言(例如英语)已经知道的内容开始可能会很有用。
移学习是一种非常强大的深度学习技术,在不同领域中有更多应用。 直觉非常简单,可以用类推来解释。 假设您想学习一种新的语言,例如西班牙语,那么从另一种语言(例如英语)已经知道的内容开始可能会很有用。
按照这种思路,计算机视觉研究人员现在通常使用经过预训练的 CNN 来生成新任务的表示形式,其中数据集可能不足以从头训练整个 CNN。 另一个常见的策略是采用经过预先训练的 ImageNet 网络,然后将整个网络微调到新颖的任务。
......@@ -953,7 +953,7 @@ WaveNet 是一种卷积网络,其中卷积层具有各种扩张因子,从而
* 使用预构建的单词嵌入将单词映射到相邻相似单词的空间中。
* 使用 LSTM 层构建语言模型。 LSTM 将在第 6 章中讨论,现在我们将它们用作黑盒。
* 组合不同的异构输入要素以创建组合的要素空间。 对于此任务,我们将使用新的 Keras 2.0 函数式 API。
* 附加一些其他的密集和丢弃层,以创建多层感知并增强我们的深度学习网络的功能。
* 附加一些其他的密集和丢弃层,以创建多层感知并增强我们的深度学习网络的功能。
为了简单起见,我们不会在 5 中重新训练组合网络,而是使用已经在线提供的[预先训练的权重集](https://avisingh599.github.io/deeplearning/visual-qa/)。 有兴趣的读者可以在由 N 个图像,N 个问题和 N 个答案组成的自己的训练数据集上对网络进行再训练。 这是可选练习。 该网络的灵感来自[《VQA:视觉问题解答》](http://arxiv.org/pdf/1505.00468v4.pdf)(Aishwarya Agrawal,Jiasen Lu,Stanislaw Antol,Margaret Mitchell,C.Lawrence Zitnick,Dhruv Batra,Devi Parikh,2015 年):
......@@ -1225,7 +1225,7 @@ print str(round(y_output[0,label]*100,2)).zfill(5), "% ", labelencoder.inverse_t
# 工作原理
视觉问题解答的任务是通过结合使用不同的深度神经网络来解决的。 预训练的 VGG16 已用于从图像中提取特征,而 LSTM 序列已用于从先前映射到嵌入空间的问题中提取特征。 VGG16 是用于图像特征提取的 CNN,而 LSTM 是用于提取表示序列的时间特征的 RNN。 目前,这两种方法的结合是处理此类网络的最新技术。 然后,在组合模型的顶部添加一个具有辍学功能的多层感知,以形成我们的深度网络。
视觉问题解答的任务是通过结合使用不同的深度神经网络来解决的。 预训练的 VGG16 已用于从图像中提取特征,而 LSTM 序列已用于从先前映射到嵌入空间的问题中提取特征。 VGG16 是用于图像特征提取的 CNN,而 LSTM 是用于提取表示序列的时间特征的 RNN。 目前,这两种方法的结合是处理此类网络的最新技术。 然后,在组合模型的顶部添加一个具有辍学功能的多层感知,以形成我们的深度网络。
# 更多
......@@ -1233,7 +1233,7 @@ print str(round(y_output[0,label]*100,2)).zfill(5), "% ", labelencoder.inverse_t
除此之外,有兴趣的读者可以在[互联网](https://github.com/anujshah1003/VQA-Demo-GUI)上找到一个不错的 GUI,它建立在 Avi Singh 演示的顶部,使您可以交互式加载图像并提出相关问题。 还提供了 [YouTube 视频](https://www.youtube.com/watch?v=7FB9PvzOuQY)
# 通过六种不同方式对视频进行预训练网络分类
# 通过六种不同方式将预训练网络用于视频分类
对视频进行分类是一个活跃的研究领域,因为处理此类媒体需要大量数据。 内存需求经常达到现代 GPU 的极限,可能需要在多台机器上进行分布式训练。 目前,研究正在探索复杂性不断提高的不同方向,让我们对其进行回顾。
......@@ -1243,7 +1243,7 @@ print str(round(y_output[0,label]*100,2)).zfill(5), "% ", labelencoder.inverse_t
第三种方法是使用 3D 卷积网络,其中 3D 卷积网络是在 3D 张量(`time``image_width``image_height`)上运行的 2D 卷积网络的扩展。 这种方法是图像分类的另一个自然扩展,但同样,3D 卷积网络可能很难训练。
第四种方法基于智能直觉。 代替直接使用 CNN 进行分类,它们可以用于存储视频中每个帧的脱机功能。 想法是,如先前的食谱所示,可以通过移学习使特征提取非常有效。 提取所有特征后,可以将它们作为一组输入传递到 RNN,该 RNN 将学习多个帧中的序列并发出最终分类。
第四种方法基于智能直觉。 代替直接使用 CNN 进行分类,它们可以用于存储视频中每个帧的脱机功能。 想法是,如先前的食谱所示,可以通过移学习使特征提取非常有效。 提取所有特征后,可以将它们作为一组输入传递到 RNN,该 RNN 将学习多个帧中的序列并发出最终分类。
第五种方法是第四种方法的简单变体,其中最后一层是 MLP 而不是 RNN。 在某些情况下,就计算要求而言,此方法可能更简单且成本更低。
......
......@@ -245,7 +245,7 @@ fit(
)
```
根据 TensorFlow 文档,对于`KmeansClustering`器,我们需要向`fit()`提供`input_fn()``cluster`方法返回聚类中心,`predict_cluster_idx`方法返回预测的聚类索引。
根据 TensorFlow 文档,对于`KmeansClustering`器,我们需要向`fit()`提供`input_fn()``cluster`方法返回聚类中心,`predict_cluster_idx`方法返回预测的聚类索引。
# 操作步骤
......
......@@ -10,7 +10,7 @@
# 介绍
自编码器,也称为**空竹网络****自动关联器**,最初由 Hinton 和 PDP 小组于 1980 年代提出。 它们是前馈网络,没有任何反馈,并且它们是通过无监督学习来学习的。 像第 3 章的多人感知器,神经网络感知器一样,它们使用反向传播算法进行学习,但有一个主要区别-目标与输入相同。
自编码器,也称为**空竹网络****自动关联器**,最初由 Hinton 和 PDP 小组于 1980 年代提出。 它们是前馈网络,没有任何反馈,并且它们是通过无监督学习来学习的。 像第 3 章的多人感知机,神经网络感知机一样,它们使用反向传播算法进行学习,但有一个主要区别-目标与输入相同。
我们可以认为自编码器由两个级联网络组成-第一个网络是编码器,它接受输入`x`,然后使用变换`h`将其编码为编码信号`y`
......
......@@ -1066,7 +1066,7 @@ if __name__ == '__main__':
看到代理商第一次学习演奏的任何人都会对此感到惊讶-看起来很像人。 最初的举动总是很笨拙。 缓慢地,坐席会学习走哪条路,尽管速度很慢并且经常会错过球。 但是,随着学习的继续,代理将成为专家。
但这与我们很不一样。 一旦学会玩游戏,我们便可以在其他任何类似情况下轻松使用该知识。 RL 代理将无法执行此操作-即使是简单的事情(例如更改环境空间的大小)也会将其恢复为零。 移学习是研究人员正在研究的一种技术,它可以帮助主体在另一环境空间中的一个环境中使用它所学到的知识,也许有一天可以为真正的人工智能奠定基础。
但这与我们很不一样。 一旦学会玩游戏,我们便可以在其他任何类似情况下轻松使用该知识。 RL 代理将无法执行此操作-即使是简单的事情(例如更改环境空间的大小)也会将其恢复为零。 移学习是研究人员正在研究的一种技术,它可以帮助主体在另一环境空间中的一个环境中使用它所学到的知识,也许有一天可以为真正的人工智能奠定基础。
# AlphaGo Zero
......
......@@ -30,7 +30,7 @@ Quoc 和 Barret 将 AutoML 技术用于神经体系结构搜索应用于 [Penn T
# 元学习新任务
可以对元学习系统进行训练以完成大量任务,然后对其元学习新任务的能力进行测试。 这种元学习的一个著名例子是在高级 CNN 章节中讨论的所谓移学习,其中网络可以从相对较小的数据集中成功学习基于图像的新任务。 但是,对于诸如语音,语言和文本之类的非视觉领域,没有类似的预训练方案。
可以对元学习系统进行训练以完成大量任务,然后对其元学习新任务的能力进行测试。 这种元学习的一个著名例子是在高级 CNN 章节中讨论的所谓移学习,其中网络可以从相对较小的数据集中成功学习基于图像的新任务。 但是,对于诸如语音,语言和文本之类的非视觉领域,没有类似的预训练方案。
[《用于快速适应深度网络的模型不可知元学习》](https://arxiv.org/abs/1703.03400)(切尔西·芬恩(Chelsea Finn),彼得·阿比尔(Siety Levine),2017 年)提出了一个模型 -不可知论方法的名称为 MAML,它与经过梯度下降训练的任何模型兼容,并且适用于各种不同的学习问题,包括分类,回归和强化学习。 元学习的目标是针对各种学习任务训练模型,以便仅使用少量训练样本即可解决新的学习任务。 元学习器旨在找到一种可以快速(以很少的步骤)并有效地(仅使用几个示例)快速适应各种问题的初始化。 用参数为θ的参数化函数`f[0]`表示的模型。 当适应新任务`T[i]`时,模型参数`θ`变为`θ[i']`。 在 MAML 中,使用对任务`T[i]`的一个或多个梯度下降更新来计算更新的参数向量`θ[i']`
......
......@@ -2,7 +2,7 @@
+ [零、前言](00.md)
+ [一、TensorFlow 简介](01.md)
+ [二、回归](02.md)
+ [三、神经网络:感知](03.md)
+ [三、神经网络:感知](03.md)
+ [四、卷积神经网络](04.md)
+ [五、高级卷积神经网络](05.md)
+ [六、循环神经网络](06.md)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册