提交 3319484c 编写于 作者: W wizardforcel

2021-01-06 18:15:34

上级 469c1828
......@@ -372,8 +372,8 @@ model.add(Dense(num_labels))
还可以使用其他非线性函数,例如`elu``selu``softplus``sigmoid``tanh`。 但是,`relu`是最常用的功能,由于其简单性,在计算上是有效的。 Sigmoid 和 tanh 函数在输出层中用作激活函数,稍后将描述。“表 1.3.1”显示了每个激活函数的方程式:
<colgroup><col> <col> <col></colgroup>
| `relu` | `relu(x) = max(0, x)` | 1.3.1 |
| --- | --- | --- |
| `softplus` | `softplus(x) = log(1 + exp(x))` | 1.3.2 |
| `elu` | ![](img/B14853_01_002.png) 其中`a≥0`并且是可调超参数 | 1.3.3 |
| `selu` | `selu(x) = k×elu(x, a)`其中`k = 1.0507009873554804934193193349852946``a = 1.6732632423543772848170429916717` | 1.3.4 |
......@@ -415,59 +415,14 @@ model.add(Dense(hidden_units,
该方程适用于所有`N = 10`输出,`x[i]`对于`i = 0, 1, ..., 9`作最终预测。 `softmax`的概念非常简单。 通过对预测进行归一化,将输出压缩为概率。 在此,每个预测输出都是该索引是给定输入图像的正确标签的概率。 所有输出的所有概率之和为 1.0。 例如,当`softmax`层生成预测时,它将是一个 10 维一维张量,看起来像以下输出:
<colgroup><col> <col> <col></colgroup>
|
```py
[3.57351579e-11
```
|
```py
7.08998016e-08 2.30154569e-07
```
|
```py
6.35787558e-07
```
|
|
```py
5.57471187e-11
```
|
```py
4.15353840e-09 3.55973775e-16
```
|
```py
9.99995947e-01
[3.57351579e-11 7.08998016e-08
2.30154569e-07 6.35787558e-07
5.57471187e-11 4.15353840e-09
3.55973775e-16 9.99995947e-01
1.29531730e-09 3.06023480e-06]
```
|
|
```py
1.29531730e-09
```
|
```py
3.06023480e-06]
```
| |
预测输出张量建议输入图像的索引具有最高概率,因此将为 7。 `numpy.argmax()`方法可用于确定具有最高值的元素的索引。
输出激活层还有其他选择,例如`linear``sigmoid``tanh``linear`激活是一种身份功能。 它将其输入复制到其输出。 `sigmoid`功能更具体地是,称为**逻辑 Sigmoid**。 如果预测张量的元素将独立地映射在 0.0 和 1.0 之间,则将使用此方法。 与`softmax`中不同,预测张量的所有元素的总和不限于 1.0。 例如,`sigmoid`用作情感预测(从 0.0 到 1.0、0.0 不好,1.0 很好)或图像生成(0.0 映射到像素级别 0 和 1.0 映射到像素 255)的最后一层 。
......@@ -484,8 +439,8 @@ model.add(Dense(hidden_units,
预测张量距单热地面真值向量有多远称为损失。 损失函数的一种类型是`mean_squared_error`**MSE**),或者是目标或标签与预测之间差异的平方的平均值。 在当前示例中,我们使用`categorical_crossentropy`。 它是目标或标签乘积与每个类别的预测对数之和的负数。 Keras 中还有其他损失函数,例如`mean_absolute_error``binary_crossentropy`。“表 1.3.2”总结了的常见损耗函数。
<colgroup><col> <col></colgroup>
| **损失函数** | **公式** |
| --- | --- |
| `mean_squared_error` | ![](img/B14853_01_009.png) |
| `mean_absolute_error` | ![](img/B14853_01_010.png) |
| `categorical_crossentropy` | ![](img/B14853_01_011.png) |
......@@ -564,19 +519,20 @@ model.fit(x_train, y_train, epochs=20, batch_size=batch_size)
下表演示了调整期间典型的深度神经网络性能:
| **层** | **正则化函数** | **优化器** | **ReLU** | **训练准确率(%)** | **测试准确率(%)** |
| 256-256-256 | 没有 | 新元 | 没有 | 93.65 | 92.5 |
| 256-256-256 | L2(0.001) | 新元 | 是 | 99.35 | 98.0 |
| 256-256-256 | L2(0.01) | 新元 | 是 | 96.90 | 96.7 |
| 256-256-256 | 没有 | 新元 | 是 | 99.93 | 98.0 |
| 256-256-256 | 丢弃(0.4) | 新元 | 是 | 98.23 | 98.1 |
| 256-256-256 | 丢弃(0.45) | 新元 | 是 | 98.07 | 98.1 |
| 256-256-256 | 丢弃(0.5) | 新元 | 是 | 97.68 | 98.1 |
| 256-256-256 | 丢弃(0.6) | 新元 | 是 | 97.11 | 97.9 |
| 256-512-256 | 丢弃(0.45) | 新元 | 是 | 98.21 | 98.2 |
| 512-512-512 | 丢弃(0.2) | 新元 | 是 | 99.45 | 98.3 |
| 512-512-512 | 丢弃(0.4) | 新元 | 是 | 98.95 | 98.3 |
| 512-1024-512 | 丢弃(0.45) | 新元 | 是 | 98.90 | 98.2 |
| 1024-1024-1024 | 丢弃(0.4) | 新元 | 是 | 99.37 | 98.3 |
| --- | --- | --- | --- | --- | --- |
| 256-256-256 | 没有 | SGD | 没有 | 93.65 | 92.5 |
| 256-256-256 | L2(0.001) | SGD | 是 | 99.35 | 98.0 |
| 256-256-256 | L2(0.01) | SGD | 是 | 96.90 | 96.7 |
| 256-256-256 | 没有 | SGD | 是 | 99.93 | 98.0 |
| 256-256-256 | 丢弃(0.4) | SGD | 是 | 98.23 | 98.1 |
| 256-256-256 | 丢弃(0.45) | SGD | 是 | 98.07 | 98.1 |
| 256-256-256 | 丢弃(0.5) | SGD | 是 | 97.68 | 98.1 |
| 256-256-256 | 丢弃(0.6) | SGD | 是 | 97.11 | 97.9 |
| 256-512-256 | 丢弃(0.45) | SGD | 是 | 98.21 | 98.2 |
| 512-512-512 | 丢弃(0.2) | SGD | 是 | 99.45 | 98.3 |
| 512-512-512 | 丢弃(0.4) | SGD | 是 | 98.95 | 98.3 |
| 512-1024-512 | 丢弃(0.45) | SGD | 是 | 98.90 | 98.2 |
| 1024-1024-1024 | 丢弃(0.4) | SGD | 是 | 99.37 | 98.3 |
| 256-256-256 | 丢弃(0.6) | Adam | 是 | 98.64 | 98.2 |
| 256-256-256 | 丢弃(0.55) | Adam | 是 | 99.02 | 98.3 |
| 256-256-256 | 丢弃(0.45) | Adam | 是 | 99.39 | 98.5 |
......@@ -805,7 +761,8 @@ Non-trainable params: 0
“表 1.4.1”显示了 99.4% 的最大测试准确率,这对于使用带有`dropout=0.2`的 Adam 优化器的每层具有 64 个特征图的 3 层网络可以实现。 CNN 比 MLP 具有更高的参数效率,并且具有更高的准确率。 同样,CNN 也适合从顺序数据,图像和视频中学习表示形式。
| **层** | **优化器** | **正则化函数** | **训练准确率(%)** | **测试准确率(%)** |
| 64-64-64 | 新元 | 丢弃(0.2) | 97.76 | 98.50 |
| --- | --- | --- | --- | --- | --- |
| 64-64-64 | SGD | 丢弃(0.2) | 97.76 | 98.50 |
| 64-64-64 | RMSprop | 丢弃(0.2) | 99.11 | 99.00 |
| 64-64-64 | Adam | 丢弃(0.2) | 99.75 | 99.40 |
| 64-64-64 | Adam | 丢弃(0.4) | 99.64 | 99.30 |
......@@ -939,10 +896,11 @@ Non-trainable params: 0
“表 1.5.1”显示 SimpleRNN 在所呈现的网络中具有最低的准确率:
| **层** | **优化器** | **正则化函数** | **训练准确率(%)** | **测试准确率(%)** |
| 256 | 新元 | 丢弃(0.2) | 97.26 | 98.00 |
| --- | --- | --- | --- | --- | --- |
| 256 | SGD | 丢弃(0.2) | 97.26 | 98.00 |
| 256 | RMSprop | 丢弃(0.2) | 96.72 | 97.60 |
| 256 | Adam | 丢弃(0.2) | 96.79 | 97.40 |
| 512 | 新元 | 丢弃(0.2) | 97.88 | 98.30 |
| 512 | SGD | 丢弃(0.2) | 97.88 | 98.30 |
表 1.5.1:不同的`SimpleRNN`网络配置和性能指标
......
......@@ -371,17 +371,17 @@ from tensorflow.keras.datasets import cifar10
对于 CIFAR10 数据,可以使用“表 2.2.1”中所示的不同网络架构来构建 ResNet。“表 2.2.1”表示我们有三组残差块。 每组具有对应于`n`个残余块的`2n`层。`32×32`的额外层是输入图像的第一层。
<colgroup><col> <col> <col> <col> <col> <col></colgroup>
| **层** | **输出大小** | **过滤器尺寸** | **操作** |
| 卷积 | 32 × 32 | 16 | 3 x 3 Conv2D |
| 残差块(1) | 32 × 32 | | ![](img/B14853_02_001.png) |
| 过渡层(1) | 32 × 32 | | `{1 x 1 Conv2D, stride = 2}` |
| 16 × 16 | |
| 残块(2) | 16 × 16 | 32 | ![](img/B14853_02_002.png) |
| 过渡层(2) | 16 × 16 | | | | `{1 x 1 Conv2D, stride = 2}` |
| 8 × 8 | |
| 残块(3) | 8 × 8 | 64 | ![](img/B14853_02_003.png) |
| 平均池化 | 1 × 1 | | | `8 x 8 AveragePooling2D` |
| --- | --- | --- | --- |
| 卷积 | `32 × 32` | 16 | `3 x 3 Conv2D` |
| 残差块(1) | `32 × 32` | | ![](img/B14853_02_001.png) |
| 过渡层(1) | `32 × 32` | | `{1 x 1 Conv2D, stride = 2}` |
| | `16 × 16` | |
| 残差块(2) | `16 × 16` | 32 | ![](img/B14853_02_002.png) |
| 过渡层(2) | `16 × 16` | | | | `{1 x 1 Conv2D, stride = 2}` |
| | `8 × 8` | |
| 残差块(3) | `8 × 8` | 64 | ![](img/B14853_02_003.png) |
| 平均池化 | `1 × 1` | | | `8 x 8 AveragePooling2D` |
表 2.2.1:ResNet 网络架构配置
......@@ -524,6 +524,7 @@ def resnet_v1(input_shape, depth, num_classes=10):
ResNet 在`n`的各种值上的性能显示在“表 2.2.2”中。
| **层** | `n` | **CIFAR10 的准确率百分比(原始论文)** | **CIFAR10 的准确率百分比(本书)** |
| --- | --- | --- | --- |
| ResNet20 | 3 | 91.25 | 92.16 |
| ResNet32 | 5 | 92.49 | 92.46 |
| ResNet44 | 7 | 92.83 | 92.50 |
......@@ -721,6 +722,7 @@ else:
ResNet v2 的准确率显示在下面的“表 2.3.1”中:
| **层** | `n` | **CIFAR10 的准确率百分比(原始论文)** | **CIFAR10 的准确率百分比(本书)** |
| --- | --- | --- | --- |
| ResNet56 | 9 | 不适用 | 93.01 |
| ResNet110 | 18 | 93.63 | 93.15 |
......@@ -779,14 +781,15 @@ DenseNet 建议在`Dense`块之前加上`BN-ReLU-Conv2D`,以及许多是增长
“表 2.4.1”显示了模型配置,而“图 2.4.4”显示了模型架构。 清单为我们展示了具有 100 层的 DenseNet-BC 的部分 Keras 实现。 我们需要注意的是,我们使用`RMSprop`,因为在使用 DenseNet 时,它的收敛性优于 SGD 或 Adam。
| **层** | **输出大小** | **DenseNet-100 BC** |
| --- | --- | --- |
| 卷积 | `32 x 32` | `3 x 3 Conv2D` |
| 致密块(1) | `32 x 32` | ![](img/B14853_02_006.png) |
| 密集块(1) | `32 x 32` | ![](img/B14853_02_006.png) |
| 过渡层(1) | `32 x 32` | ![](img/B14853_02_007.png) |
| `16 x 16` |
| 致密块(2) | `16 x 16` | ![](img/B14853_02_008.png) |
| 密集块(2) | `16 x 16` | ![](img/B14853_02_008.png) |
| 过渡层(2) | `16 x 16` | ![](img/B14853_02_009.png) |
| `8 x 8` |
| 致密块(3) | `8 x 8` | ![](img/B14853_02_006.png) |
| 密集块(3) | `8 x 8` | ![](img/B14853_02_006.png) |
| 平均池化 | `1 x 1` | `8 x 8 AveragePooling2D` |
| 分类层 | | `Flatten-Dense(10)-softmax` |
......
......@@ -37,20 +37,11 @@ WGAN 认为 GAN 固有的不稳定性是由于它的损失函数引起的,该
**JS**`D[JS]`是基于`D[KL]`的差异。 但是,与`D[KL]`不同,`D[JS]`是对称的并且是有限的。 在本节中,我们将演示优化 GAN 损失函数等同于优化`D[JS]`
<colgroup><col> <col></colgroup>
| **散度** | **表达式** |
| Kullback-Leibler(KL)“公式 5.1.1” |
![](img/B14853_05_003.png)
![](img/B14853_05_004.png)
|
| *詹森·香农(JS)“公式 5.1.2” |
![](img/B14853_05_005.png)
|
| --- | --- |
| Kullback-Leibler(KL)“公式 5.1.1” | ![](img/B14853_05_003.png) |
| | ![](img/B14853_05_004.png) |
| *詹森·香农(JS)“公式 5.1.2” | ![](img/B14853_05_005.png) |
| 陆地移动距离(EMD)或 Wasserstein 1 “公式 5.1.3” |
![](img/B14853_05_006.png)
......@@ -172,24 +163,13 @@ EMD 背后的想法是,它是为了确定概率分布`p_data`应由![](img/B14
“表 5.1.2”显示了 GAN 和 WGAN 的损失函数之间的差异。 为简洁起见,我们简化了![](img/B14853_05_066.png)和![](img/B14853_05_067.png)的表示法:
<colgroup><col> <col> <col></colgroup>
| **网络** | **损失函数** | **公式** |
| GAN |
![](img/B14853_05_068.png)
![](img/B14853_05_069.png)
| 4.1.14.1.5 |
| WGAN |
![](img/B14853_05_070.png)
![](img/B14853_05_071.png)
![](img/B14853_05_072.png)
| 5.1.215.1.225.1.20 |
| --- | --- | --- |
| GAN | ![](img/B14853_05_068.png) | 4.1.1 |
| | ![](img/B14853_05_069.png) | 4.1.5 |
| WGAN | ![](img/B14853_05_070.png) | 5.1.21 |
| | ![](img/B14853_05_071.png) | 5.1.22 |
| | ![](img/B14853_05_072.png) | 5.1.20 |
表 5.1.2:GAN 和 WGAN 的损失函数之间的比较
......@@ -530,31 +510,15 @@ LSGAN 提出最小二乘损失。“图 5.2.1”演示了为什么在 GAN 中使
“表 5.2.1”显示了 GAN,WGAN 和 LSGAN 之间的损耗函数的比较:
<colgroup><col> <col> <col></colgroup>
| **网络** | **损失函数** | **公式** |
| GAN |
![](img/B14853_05_095.png)
![](img/B14853_05_096.png)
| 4.1.14.1.5 |
| WGAN |
![](img/B14853_05_097.png)
![](img/B14853_05_098.png)
![](img/B14853_05_099.png)
| 5.1.215.1.225.1.20 |
| LSGAN |
![](img/B14853_05_100.png)
![](img/B14853_05_101.png)
| 5.2.15.2.2 |
| --- | --- | --- |
| GAN | ![](img/B14853_05_095.png) | 4.1.1 |
| | ![](img/B14853_05_096.png) | 4.1.5 |
| WGAN | ![](img/B14853_05_097.png) | 5.1.21 |
| | ![](img/B14853_05_098.png) | 5.1.22 |
| | ![](img/B14853_05_099.png) | 5.1.20 |
| LSGAN | ![](img/B14853_05_100.png) | 5.2.1 |
| | ![](img/B14853_05_101.png) | 5.2.2 |
表 5.2.1:GAN,WGAN 和 LSGAN 损失函数之间的比较
......@@ -669,22 +633,12 @@ ACGAN 在原理上类似于我们在上一章中讨论的**条件 GAN**(**CGAN
“表 5.3.1”显示了 ACGAN 损失函数与 CGAN 损失函数的比较:
<colgroup><col> <col> <col></colgroup>
| **网络** | **损失函数** | **编号** |
| CGAN |
![](img/B14853_05_102.png)
![](img/B14853_05_103.png)
| 4.3.14.3.2 |
| ACGAN |
![](img/B14853_05_104.png)
![](img/B14853_05_105.png)
| 5.3.15.3.2 |
| --- | --- | --- |
| CGAN | ![](img/B14853_05_102.png) | 4.3.1 |
| | ![](img/B14853_05_103.png) | 4.3.2 |
| ACGAN | ![](img/B14853_05_104.png) | 5.3.1 |
| | ![](img/B14853_05_105.png) | 5.3.2 |
表 5.3.1:CGAN 和 ACGAN 损失函数之间的比较
......
......@@ -99,10 +99,13 @@ InfoGAN 的关键思想是强制 GAN 不要忽略潜在代码`c`。 这是通过
“表 6.1.1”显示了与 GAN 相比 InfoGAN 的损失函数:
<colgroup><col> <col> <col></colgroup>
| **网络** | **损失函数** | **编号** |
| GAN | ![](img/B14853_06_019.png)![](img/B14853_06_020.png) | 4.1.14.1.5 |
| InfoGAN | ![](img/B14853_06_021.png)![](img/B14853_06_022.png)对于连续代码,InfoGAN 建议使用![](img/B14853_06_023.png)的值。 在我们的示例中,我们设置![](img/B14853_06_024.png)。 对于离散代码,InfoGAN 建议使用![](img/B14853_06_025.png)。 | 6.1.16.1.2 |
| --- | --- | --- |
| GAN | ![](img/B14853_06_019.png) | 4.1.1 |
| | ![](img/B14853_06_020.png) | 4.1.5 |
| InfoGAN | ![](img/B14853_06_021.png) | 6.1.1 |
| | ![](img/B14853_06_022.png) | 6.1.2 |
| | 对于连续代码,InfoGAN 建议使用![](img/B14853_06_023.png)的值。 在我们的示例中,我们设置![](img/B14853_06_024.png)。 对于离散代码,InfoGAN 建议使用![](img/B14853_06_025.png)。 | |
表 6.1.1:GAN 和 InfoGAN 的损失函数之间的比较
......@@ -771,8 +774,15 @@ def build_encoder(inputs, num_labels=10, feature1_dim=256):
假设*编码器*输入(`x[r]`)中间特征(`f[1r]`)和标签(`y[r]`),每个 GAN 都采用通常的区分-对抗方式进行训练。 损耗函数由“表 6.2.1”中的“公式 6.2.1”至“公式 6.2.5”给出。“公式 6.2.1”和“公式 6.2.2”是通用 GAN 的常见损耗函数。 StackedGAN 具有两个附加损失函数,即**有条件****熵**
| **网络** | **损失函数** | **编号** |
| GAN | ![](img/B14853_06_030.png)![](img/B14853_06_031.png) | 4.1.14.1.5 |
| 栈式 | ![](img/B14853_06_032.png)![](img/B14853_06_033.png)![](img/B14853_06_034.png)![](img/B14853_06_035.png)![](img/B14853_06_036.png)其中![](img/B14853_06_037.png)是权重,`i`是编码器和 GAN ID | 6.2.16.2.26.2.36.2.46.2.5 |
| --- | --- | --- |
| GAN | ![](img/B14853_06_030.png) | 4.1.1 |
| | ![](img/B14853_06_031.png) | 4.1.5 |
| 栈式 | ![](img/B14853_06_032.png) | 6.2.1 |
| | ![](img/B14853_06_033.png) | 6.2.2 |
| | ![](img/B14853_06_034.png) | 6.2.3 |
| | ![](img/B14853_06_035.png) | 6.2.4 |
| | ![](img/B14853_06_036.png) | 6.2.5 |
| | 其中![](img/B14853_06_037.png)是权重,`i`是编码器和 GAN ID | |
表 6.2.1:GAN 和 StackedGAN 的损失函数之间的比较。 `~p_data`表示从相应的编码器数据(输入,特征或输出)采样
......
......@@ -274,7 +274,7 @@ model.add(Dense(500, activation='relu'))
model.add(Dense(32))
```
该代码拍摄一张图像,并应用 32 个大小为`(3, 3)`的卷积过滤器,然后激活和最大池化层。 它重复相同的过程多次,并增加过滤器的数量,然后是平坦且致密的层。 最终的密集层包含 32 个元素,分别代表我们要预测的关键点的`x``y`值。
该代码拍摄一张图像,并应用 32 个大小为`(3, 3)`的卷积过滤器,然后激活和最大池化层。 它重复相同的过程多次,并增加过滤器的数量,然后是平坦且密集的层。 最终的密集层包含 32 个元素,分别代表我们要预测的关键点的`x``y`值。
# 训练模型以进行关键点预测
......
......@@ -328,7 +328,7 @@ model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(AveragePooling2D(pool_size=(3,3), strides=(2, 2)))
```
致密层没有变化。 输出如下:
密集层没有变化。 输出如下:
```py
Epoch 1/5
......
......@@ -88,7 +88,7 @@ Modelx = VGG16 or ResNet50 or InceptionV3
模型构建具有三个重要参数:
* `weights` 是我们在以前下载的 ImageNet 图像上使用的预训练模型。
* `include_top`功能指示是否应包含最终的致密层。 对于预训练模型的类别预测,始终为`True`; 但是,在本章的后面部分(“使用 TensorFlow 开发迁移学习模型”)中,我们将学习到,在迁移学习期间,此功能设置为`False`仅包含卷积层。
* `include_top`功能指示是否应包含最终的密集层。 对于预训练模型的类别预测,始终为`True`; 但是,在本章的后面部分(“使用 TensorFlow 开发迁移学习模型”)中,我们将学习到,在迁移学习期间,此功能设置为`False`仅包含卷积层。
* `input_shape`是通道的高度,宽度和数量。 由于我们正在处理彩色图像,因此通道数设置为`3`
# 从目录输入图像
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册