提交 c28d29f6 编写于 作者: W wizardforcel

2021-01-05 23:00:11

上级 a6d1d10d
......@@ -347,7 +347,7 @@ plt.show()
# 标准化和分割数据
图像中像素的值范围为 0 到 255。始终建议在计算上将输入值保持在`0``1`之间。 因此,我们将通过将数据除以最大可能值 255 来归一化我们的数据,以使`0``1`之间的所有内容都变为正常。 同样,输入图像的尺寸为 28 x 28,但我们的 DFN 并不采用二维输入。 因此,我们将输入训练图像从(`60000, 28, 28`)展平到(`60000, 784`)并测试从(`10000, 28, 28`)到(`10000, 784`的输入图像:
图像中像素的值范围为 0 到 255。始终建议在计算上将输入值保持在`0``1`之间。 因此,我们将通过将数据除以最大可能值 255 来归一化我们的数据,以使`0``1`之间的所有内容都变为正常。 同样,输入图像的尺寸为`28 x 28`,但我们的 DFN 并不采用二维输入。 因此,我们将输入训练图像从`(60000, 28, 28)`展平到`(60000, 784)`并测试从`(10000, 28, 28)``(10000, 784)`的输入图像:
```py
trainX = trainX.reshape(trainX.shape[0], 784) / 255.0
......@@ -366,7 +366,7 @@ trainX, valX, trainY, valY = train_test_split(trainX, trainY, test_size = 0.1, r
与准备数据有关的大多数任务现已完成。 现在,我们将重点介绍深层前馈模型。 在构建模型图之前,我们将确定模型的以下参数:
* **类的数量**`CLASS_NUM`):在 MNIST 时尚数据集中,有 10 个类。 因此,我们将分类的类数为 10。
* **输入神经元的数量**`INPUT_UNITS`):我们将输入层中的一个神经元附加到图像的一个像素值。 输入层中有 784(28 x2 8)个神经元。
* **输入神经元的数量**`INPUT_UNITS`):我们将输入层中的一个神经元附加到图像的一个像素值。 输入层中有 784(`28 x 28`)个神经元。
* **第一层神经元的数量**`HIDDEN_LAYER_1_UNITS`):我们决定在网络的第一隐藏层中保留 256 个神经元。 您可以尝试将此数字更改为您的选择。
* **第二层神经元的数量**`HIDDEN_LAYER_2_UNITS`):在第二层隐藏层中,保留了 128 个神经元。 同样,您可以将此数字更改为选择之一。
* **输出层中神经元的数量**`OUTPUT_LAYER_UNITS`):由于我们将使用 softmax 激活,因此输出层中的每个神经元将输出属于该类别的输入的概率。 因此,我们需要使神经元的数量等于类的数量。
......
# 受限的玻尔兹曼机和自编码器
当您在线购物或浏览电影时,您可能会想知道“您可能也喜欢的电影”产品如何工作。 在本章中,我们将说明幕后算法,称为**受限玻尔兹曼机****RBM**)。 我们将首先回顾 RBM 及其发展路径。 然后,我们将更深入地研究其背后的逻辑,并在 TensorFlow 中实现 RBM。 我们还将应用它们来构建电影推荐器。 除了浅层架构,我们还将继续使用称为**深度信念网络****DBN**)的 RBM 堆叠版本,并使用它对图像进行分类,当然,我们在 TensorFlow 中的实现 刮。**
当您在线购物或浏览电影时,您可能会想知道“您可能也喜欢的电影”产品如何工作。 在本章中,我们将说明幕后算法,称为**受限玻尔兹曼机****RBM**)。 我们将首先回顾 RBM 及其发展路径。 然后,我们将更深入地研究其背后的逻辑,并在 TensorFlow 中实现 RBM。 我们还将应用它们来构建电影推荐器。 除了浅层架构,我们还将继续使用称为**深度信念网络****DBN**)的 RBM 堆叠版本,并使用它对图像进行分类,当然,我们在 TensorFlow 中实现。
RBM 通过尝试重建输入数据来找到输入的潜在表示。 在本章中,我们还将讨论自编码器,这是另一种具有类似想法的网络。 在本章的后半部分,我们将继续介绍自编码器,并简要介绍它们的发展路径。 我们将说明按照其架构或形式化形式分类的各种自编码器。 我们还将采用不同类型的自编码器来检测信用卡欺诈。 这将是一个有趣的项目,更令人着迷的是,您将看到这些自编码器种类如何努力学习使用某些架构或强加约束形式的更健壮的表示形式。
......@@ -52,7 +52,7 @@ RBM 中显然没有输出层,因此学习与前馈网络中的学习有很大
从可见层`v^(0)`的初始状态开始,计算`P(h | v^(0))`; 隐藏层`h^(0)``P(h | v^(0))`采样,然后计算`P(v | h^(0))`。 接下来,基于`P(v | h^(0))`采样状态`v^(1)``h^(1)`基于`P(h | v^(1))`采样,依此类推。 此过程称为吉布斯采样。 也可以将其视为重建可见层。
* 根据初始状态`v^(0)``k` Gibbs 步骤之后的状态`v^(k)`计算梯度,其中![](img/46a593b3-1881-4d52-84ad-34c70bb0d13c.png)表示外部乘积:
* 根据初始状态`v^(0)``k`吉布斯步骤之后的状态`v^(k)`计算梯度,其中![](img/46a593b3-1881-4d52-84ad-34c70bb0d13c.png)表示外部乘积:
![](img/d4a21cdd-b149-43ee-aa01-cb823662c83d.png)
......@@ -98,7 +98,7 @@ DBN 也有许多有趣的应用程序,例如:
# RBM 及其在 TensorFlow 中的实施
让我们从初始化 RBM 模型的参数开始。 回想一下,RMB 模型由与可见层和隐藏层之间的连接关联的权重`W`,可见层的偏置`a`和偏置`b`组成。 用于隐藏层。 RBM 对象由权重`W`,偏差`a``b`,可见单元数和隐藏单元数,Gibbs 步骤数构成。 常规神经网络超参数,包括批量大小,学习率和时期数:
让我们从初始化 RBM 模型的参数开始。 回想一下,RMB 模型由与可见层和隐藏层之间的连接关联的权重`W`,可见层的偏置`a`和偏置`b`组成。 用于隐藏层。 RBM 对象由权重`W`,偏差`a``b`,可见单元数和隐藏单元数,吉布斯步骤数构成。 常规神经网络超参数,包括批量大小,学习率和时期数:
```py
>>> import numpy as np
......@@ -142,7 +142,7 @@ DBN 也有许多有趣的应用程序,例如:
这些启发式方法有助于防止收敛缓慢,并且通常是权重初始化的良好起点。
正如我们前面提到的,训练 RBM 模型是一个搜索参数的过程,该参数可以通过 Gibbs 采样最好地重构输入向量。 让我们实现 Gibbs 采样方法,如下所示:
正如我们前面提到的,训练 RBM 模型是一个搜索参数的过程,该参数可以通过吉布斯采样最好地重构输入向量。 让我们实现吉布斯采样方法,如下所示:
```py
>>> def _gibbs_sampling(self, v):
......@@ -166,7 +166,7 @@ DBN 也有许多有趣的应用程序,例如:
... return v0, prob_h_v0, vk, prob_h_vk
```
给定输入向量`vk`,吉布斯采样开始于计算`P(h | v)`。 然后执行 Gibbs 步骤。 在每个吉布斯步骤中,隐藏层`h`是根据`P(h | v)`通过伯努利采样获得的; 计算条件概率`P(v | h)`并用于生成可见矢量`v`的重建版本; 并根据最新的可见矢量更新条件概率`P(h | v)`。 最后,它返回 Gibbs 采样之前和之后的可见向量,以及 Gibbs 采样之前和之后的条件概率`P(h | v)`
给定输入向量`vk`,吉布斯采样开始于计算`P(h | v)`。 然后执行吉布斯步骤。 在每个吉布斯步骤中,隐藏层`h`是根据`P(h | v)`通过伯努利采样获得的; 计算条件概率`P(v | h)`并用于生成可见矢量`v`的重建版本; 并根据最新的可见矢量更新条件概率`P(h | v)`。 最后,它返回吉布斯采样之前和之后的可见向量,以及吉布斯采样之前和之后的条件概率`P(h | v)`
现在,我们实现了条件概率`P(v | h)``P(h | v)`的计算,以及伯努利采样:
......@@ -228,7 +228,7 @@ DBN 也有许多有趣的应用程序,例如:
... return W_grad, a_grad, b_grad
```
使用 Gibbs 采样和渐变,我们可以组合一个以时间为单位的参数更新,如下所示:
使用吉布斯采样和渐变,我们可以组合一个以时间为单位的参数更新,如下所示:
```py
>>> def _optimize(self, v):
......@@ -252,7 +252,7 @@ DBN 也有许多有趣的应用程序,例如:
除了更新权重![](img/2830e813-fe1a-4b30-8d04-7fedec2b53e1.png),偏差![](img/8b8f44c1-4476-4194-9f8d-0b55c2d91c38.png)和偏差![](img/a8f2fd84-6d41-46b3-b44a-d93fe43bf812.png)之外,我们还计算了重建可见层的均方误差。
到目前为止,我们已经准备好用于训练 RBM 模型的必要组件,因此下一步是将它们放在一起以形成 train 方法,如以下代码所示:
到目前为止,我们已经准备好用于训练 RBM 模型的必要组件,因此下一步是将它们放在一起以形成`train`方法,如以下代码所示:
```py
>>> def train(self, X_train):
......@@ -320,7 +320,7 @@ DBN 也有许多有趣的应用程序,例如:
* 用户 ID 的范围是 1 到 6,040
* MovieID 的范围是 1 到 3,952,但并非每部电影都经过分级
* 评分是{1、2、3、4、5}之一
* 评分是`{1, 2, 3, 4, 5}`之一
* 每个用户给几部电影评分
我们可以建立 RBM 模型,根据用户和其他人的电影评分推荐用户尚未观看的电影。
......@@ -348,7 +348,7 @@ DBN 也有许多有趣的应用程序,例如:
>>> print(data.shape)(6040, 3706)
```
训练数据集的大小为 6,040 x 3,706,每行包含`3706`缩放等级,包括`0.0`,表示未分级。 可以将其显示为下表(虚拟)以获得更直观的视图:
训练数据集的大小为`6,040 x 3,706`,每行包含`3706`缩放等级,包括`0.0`,表示未分级。 可以将其显示为下表(虚拟)以获得更直观的视图:
| | `movie_0` | `movie_1` | `movie_2` | ... | ... | `movie_n` |
| `user_0` | `0.0` | `0.2` | `0.8` | `0.0` | `1.0` | `0.0` |
......@@ -432,7 +432,7 @@ Number of 1.0 ratings: 226309
num_epoch=100, learning_rate=0.1, k=5)
```
我们以`80`隐藏单位,`64,100`历元的批量大小,`0.1`的学习率和`5` Gibbs 步骤初始化模型,如下所示:
我们以`80`隐藏单位,`64,100`历元的批量大小,`0.1`的学习率和`5`吉布斯步骤初始化模型,如下所示:
```py
>>> rbm.train(data)
......@@ -629,7 +629,7 @@ RBM 类的其余部分与我们先前实现的类相同。 现在,我们可以
... self.rbms.append(rbm)
```
DBN 类接受的参数包括`layer_sizes`(每层的单元数,从第一个输入层开始),`batch_size``learning_rates`(每个 RBM 单元的学习率列表),`num_epoch` Gibbs 步骤`k`
DBN 类接受的参数包括`layer_sizes`(每层的单元数,从第一个输入层开始),`batch_size``learning_rates`(每个 RBM 单元的学习率列表),`num_epoch`吉布斯步骤`k`
训练方法定义如下,其中在原始输入数据或先前隐藏层的输出上训练隐藏层的参数:
......@@ -669,7 +669,7 @@ DBN 类接受的参数包括`layer_sizes`(每层的单元数,从第一个输
# DBN 用于图像分类
我们将使用的数据集由`1797` 10 类手写数字图像组成。 每个图像的尺寸为 8 x 8,每个像素值的范围为 0 到 16。让我们读取数据集并将数据缩放到`0``1`的范围,然后将其分为训练和测试集,如下所示 :
我们将使用的数据集由`1797` 10 类手写数字图像组成。 每个图像的尺寸为`8 x 8`,每个像素值的范围为 0 到 16。让我们读取数据集并将数据缩放到`0``1`的范围,然后将其分为训练和测试集,如下所示 :
```py
>>> from sklearn import datasets
......@@ -747,7 +747,7 @@ AE 和 RBM 都旨在最小化重构误差,但是 AE 与 RBM 在以下方面有
《无监督预训练的一种方法》首次引入自编码器作为神经网络中模块化学习。 然后《通过多层感知器进行的自动关联和奇异值分解》将它们用于降维,《自编码器,最小描述长度和亥姆霍兹 *F* 能量》将其用于线性特征学习。
自编码器随着时间的推移而发展,在过去的十年中提出了几种变体。 在 2008 年,PVincent 等人。 《使用降噪自编码器提取和构成稳健特征》介绍了**去噪自编码器****DAE**), 网络被迫从损坏的版本中重建输入数据,以便他们可以学习更强大的功能。
自编码器随着时间的推移而发展,在过去的十年中提出了几种变体。 在 2008 年,P.Vincent 等人。 《使用降噪自编码器提取和构成稳健特征》介绍了**去噪自编码器****DAE**), 网络被迫从损坏的版本中重建输入数据,以便他们可以学习更强大的功能。
I.Goodfellow 等开发了**稀疏自编码器**,它通过引入稀疏约束来扩大隐藏表示。 可以在《测量深度网络中的不变性》中找到详细信息。
......@@ -941,11 +941,11 @@ Starting TensorBoard b'41' on port 6006
通过转到`http://192.168.0.12:6006`(主机可能有所不同,具体取决于您的环境),我们可以看到随着时间的推移训练损失和验证损失。
下图显示了平滑= 0(无指数平滑)时的训练损失:
下图显示了平滑 0(无指数平滑)时的训练损失:
![](img/7a055f42-2a52-4db7-824e-8a4cc5ab5a1e.png)
此处显示了平滑= 0(无指数平滑)时的验证损失:
此处显示了平滑 0(无指数平滑)时的验证损失:
![](img/a441f9d5-c897-4251-abb4-0647eb5536be.png)
......
......@@ -46,7 +46,7 @@ CNN 当然是像深度前馈网络一样的神经网络。 CNN 以可学习的
# 卷积层
我们将在这里讨论的第一件事是过滤器。 可以将滤镜视为由可学习的权重值组成的图像的较小版本。 就像我们在深层前馈网络中从一个神经元到另一个神经元具有权重连接一样,权重也存在于卷积层中,不同之处在于权重是以过滤器的形式将连接器覆盖的空间区域连接到神经元。 让我们考虑一个大小为 5 x 5(宽度和高度)的过滤器的示例。 滤镜也将延伸到图像的第三维(通道)。 对于三通道图像,滤镜尺寸为 5 x 5 x 3,对于单通道图像,滤镜尺寸为 5 x 5 x1。下图显示了 5 x 5 x 1 滤镜:
我们将在这里讨论的第一件事是过滤器。 可以将滤镜视为由可学习的权重值组成的图像的较小版本。 就像我们在深层前馈网络中从一个神经元到另一个神经元具有权重连接一样,权重也存在于卷积层中,不同之处在于权重是以过滤器的形式将连接器覆盖的空间区域连接到神经元。 让我们考虑一个大小为 5 x 5(宽度和高度)的过滤器的示例。 滤镜也将延伸到图像的第三维(通道)。 对于三通道图像,滤镜尺寸为 5 x 5 x 3,对于单通道图像,滤镜尺寸为 5 x 5 x1。下图显示了`5 x 5 x 1`滤镜:
![](img/3e990b97-ec1f-423b-8c5b-c84ab3dec1ae.png)
......@@ -56,13 +56,13 @@ CNN 当然是像深度前馈网络一样的神经网络。 CNN 以可学习的
观察感受野(输入层中的深粉红色斑块)如何连接到下一层的单个神经元
神经元如何通过卷积计算过滤器的输出? 为了理解这一点,让我们考虑在 6 x 6 x 1 图像上放置 3 x 3 x 1 滤镜的第一张幻灯片的场景。 计算过滤器中每个权重值与对应位置的像素值的点积。 对一个位置上所有权重值的点积求和,此计算出的总和就是卷积的输出。 激活功能(例如 ReLU)用于神经元的输出中。
神经元如何通过卷积计算过滤器的输出? 为了理解这一点,让我们考虑在`6 x 6 x 1`图像上放置`3 x 3 x 1`滤镜的第一张幻灯片的场景。 计算过滤器中每个权重值与对应位置的像素值的点积。 对一个位置上所有权重值的点积求和,此计算出的总和就是卷积的输出。 激活功能(例如 ReLU)用于神经元的输出中。
接下来,我们将看到滤镜如何在图像上滑动以生成卷积输出。 对于过滤器的每张幻灯片,都会将新的神经元连接到过滤器输出。 因此,滑动所涉及的参数也趋向于控制卷积层的输出尺寸。 过滤器的滑动涉及三个重要参数-步幅,零填充和深度:
* 步幅决定了滤镜从一个位置滑动到另一位置时跳跃的像素数。 通常,步幅值保持为 1。滤镜在每张幻灯片中跳一个像素。 跨度也可以大于 1,但通常不使用。
* 通常,如果滤镜从图像的左上角开始滑动,则所有幻灯片的最终生成输出趋向于具有较小的尺寸。 但是,通常,我们希望卷积层的输出具有与输入图像相同的宽度和高度。 零填充在图像的边界上添加了 0 的额外填充,从而为过滤器提供了额外的滑动空间,使得最终输出的尺寸与输入的尺寸相同。 当我们加 0 时,这不会影响卷积运算的值。
* 通常,CNN 在层中不使用单个过滤器。 我们使用一组过滤器(例如 12 个过滤器)。 这样做是因为具有不同权重集的每个滤镜趋向于捕获图像的不同特征。 来自每个过滤器的响应被一个接一个地堆叠,并且每个响应被称为**激活映射**。 例如,如果我们使用 32 x 32 x 1 的图像和四个大小为 3 x 3 x 1 的滤镜,且步幅为 2,填充为 1,则卷积层的输出尺寸为(16 x 16 x 4)。 在这里,最后一个维度将等于激活图的数量,该数量将等于过滤器的数量。 可以使用以下公式计算输出的宽度和高度:
* 通常,CNN 在层中不使用单个过滤器。 我们使用一组过滤器(例如 12 个过滤器)。 这样做是因为具有不同权重集的每个滤镜趋向于捕获图像的不同特征。 来自每个过滤器的响应被一个接一个地堆叠,并且每个响应被称为**激活映射**。 例如,如果我们使用`32 x 32 x 1`的图像和四个大小为`3 x 3 x 1`的滤镜,且步幅为 2,填充为 1,则卷积层的输出尺寸为(16 x 16 x 4)。 在这里,最后一个维度将等于激活图的数量,该数量将等于过滤器的数量。 可以使用以下公式计算输出的宽度和高度:
![](img/4a40c8d8-8ea1-4317-890e-70a3b19d3297.png)
......
......@@ -457,9 +457,9 @@ Training dataset shape: (70000, 32, 32, 1)
... return out
```
首先,它将噪声输入映射到具有 4,096 个单位的全连接层,以便它可以重塑大小为 4 x 4 x 256 的三维数据,然后由三个转置的卷积层消耗。
首先,它将噪声输入映射到具有 4,096 个单位的全连接层,以便它可以重塑大小为`4 x 4 x 256`的三维数据,然后由三个转置的卷积层消耗。
现在,我们可以为尺寸为 28 x 28 x 1 的实际输入数据定义占位符:
现在,我们可以为尺寸为`28 x 28 x 1`的实际输入数据定义占位符:
```py
>>> image_size = data.shape[1:]
......
......@@ -543,7 +543,7 @@ $python3 mo_tf.py --input_model frozen_inference_graph_fasterRCNN.pb --transform
在继续下一节之前,让我们总结到目前为止所学的模型优化技术:
1)批量归一化操作与卷积操作融合-OpenVINO 使用此
2)将步长大于 1 的卷积移动到过滤器大小 1 到 上层卷积层。 添加池化层以对齐输入形状-OpenVINO 使用此
3)用两个小滤镜替换大滤镜,例如将 3 x 3 x 3 用#32 替换为#3,将 3 x 3 x 1 替换为#3,将 1 x 1 x 3 替换为 #32-MobileNet 使用此功能。
3)用两个小滤镜替换大滤镜,例如将`3 x 3 x 3`用#32 替换为#3,将`3 x 3 x 1`替换为#3,将`1 x 1 x 3`替换为 #32-MobileNet 使用此功能。
# TensorFlow Lite 的应用
......
......@@ -88,9 +88,9 @@ CNN 的图像过滤和处理方法包括执行多种操作,所有这些操作
![](img/376d8738-6bc5-452b-965b-9742d8411f1a.png)
上图显示了 1 x 1 x 128 图像过滤器如何将卷积深度减少到 32 个通道。
上图显示了`1 x 1 x 128`图像过滤器如何将卷积深度减少到 32 个通道。
1 x 1 卷积在所有 128 个通道中与`5 x 5`输入层执行逐元素乘法–将其在深度维度上求和,并应用 ReLU 激活函数在`5 x 5`中创建单个点 输出表示 128 的输入深度。本质上,通过使用这种机制(卷积+整个深度的和),它会将三维体积折叠为具有相同宽度和高度的二维数组。 然后,它应用 32 个过滤器以创建 5 x 5 x 32 输出,如前所示。 这是有关 CNN 的基本概念,因此请花一些时间来确保您理解这一点。
1 x 1 卷积在所有 128 个通道中与`5 x 5`输入层执行逐元素乘法–将其在深度维度上求和,并应用 ReLU 激活函数在`5 x 5`中创建单个点 输出表示 128 的输入深度。本质上,通过使用这种机制(卷积+整个深度的和),它会将三维体积折叠为具有相同宽度和高度的二维数组。 然后,它应用 32 个过滤器以创建`5 x 5 x 32`输出,如前所示。 这是有关 CNN 的基本概念,因此请花一些时间来确保您理解这一点。
本书将使用`1 x 1`卷积。 稍后,您将了解到池化会减小宽度,而`1 x 1`卷积会保留宽度,但可以根据需要收缩或扩展深度。 例如,您将看到在网络和 Inception 层中使用了`1 x 1`卷积(在“第 5 章”,“神经网络架构和模型”中。具有 1 的 32 过滤器) x 1 的卷积可以在 TensorFlow 中表示为`.tf.keras.layers.Conv2D(32, (1,1))`
......
......@@ -235,7 +235,7 @@ for image_batch, label_batch in train_generator:
image_batch.shape, label_batch.shape
```
这将产生以下输出:`((64, 224, 224, 3), (64, 5))`,这意味着在第一批`train_generator`中,创建了尺寸为 224 x 224 x 3 的 64 个图像,以及 5 个单编码格式的 64 个标签。
这将产生以下输出:`((64, 224, 224, 3), (64, 5))`,这意味着在第一批`train_generator`中,创建了尺寸为`224 x 224 x 3`的 64 个图像,以及 5 个单编码格式的 64 个标签。
10. 可以通过运行以下代码来获取分配给每个标签的编码索引:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册