提交 938d1230 编写于 作者: W wizardforcel

2021-01-05 21:24:35

上级 0a7b4572
......@@ -45,7 +45,7 @@
![](img/B14853_03_006.png) (Equation 3.1.1)
在此示例中,m 是输出尺寸(例如,在 MNIST 中,`m = width × height × channels = 28 × 28 × 1 = 784`)。`x[i]`和![](img/B14853_03_007.png)分别是`x`和![](img/B14853_03_003.png)的元素。 由于损失函数是输入和输出之间差异的量度,因此我们可以使用替代的重建损失函数,例如二进制交叉熵或结构相似性指数(SSIM)。
在此示例中,`m`是输出尺寸(例如,在 MNIST 中,`m = width × height × channels = 28 × 28 × 1 = 784`)。`x[i]`和![](img/B14853_03_007.png)分别是`x`和![](img/B14853_03_003.png)的元素。 由于损失函数是输入和输出之间差异的量度,因此我们可以使用替代的重建损失函数,例如二进制交叉熵或结构相似性指数(SSIM)。
与其他神经网络类似,自编码器会在训练过程中尝试使此错误或损失函数尽可能小。“图 3.1.1”显示了一个自编码器。 编码器是将输入`x`压缩为低维潜矢量`z`的功能。 该潜矢量代表输入分布的重要特征。 然后,解码器尝试以![](img/B14853_03_003.png)的形式从潜矢量中恢复原始输入。
......@@ -53,7 +53,7 @@
图 3.1.1:自编码器的框图
为了将自编码器置于上下文中,`x`可以是尺寸为 28×28×1 = 784 的 MNIST 数字。编码器将输入转换为低维的`z`,可以是 16 维潜在向量。 解码器将尝试从`z`中以![](img/B14853_03_003.png)的形式恢复输入。
为了将自编码器置于上下文中,`x`可以是尺寸为`28×28×1 = 784`的 MNIST 数字。编码器将输入转换为低维的`z`,可以是 16 维潜在向量。 解码器将尝试从`z`中以![](img/B14853_03_003.png)的形式恢复输入。
在视觉上,每个 MNIST 数字`x`看起来都类似于![](img/B14853_03_003.png)。“图 3.1.2”向我们演示了此自编码过程。
......@@ -77,9 +77,9 @@
了解自编码器背后的原理将有助于我们执行代码。 在下一节中,我们将研究如何使用`tf.keras`功能 API 来构建编码器,解码器和自编码器。
# 2.使用 Hard 构建自编码器
# 2.使用 Keras 构建自编码器
现在,我们要使用进行一些令人兴奋的事情,使用`tf.keras`库构建一个自编码器。 为了简单起见,我们将使用 MNIST 数据集作为第一组示例。 然后,自编码器将根据输入数据生成潜矢量,并使用解码器恢复输入。 在该第一示例中,潜矢量是 16-dim
现在,我们要使用进行一些令人兴奋的事情,使用`tf.keras`库构建一个自编码器。 为了简单起见,我们将使用 MNIST 数据集作为第一组示例。 然后,自编码器将根据输入数据生成潜矢量,并使用解码器恢复输入。 在该第一示例中,潜矢量是 16
首先,我们将通过构建编码器来实现自编码器。
......@@ -244,7 +244,7 @@ plt.show()
![A screenshot of a cell phone Description automatically generated](img/B14853_03_03.png)
图 3.2.1:编码器模型由 Conv2D(32)-Conv2D(64)-Dense(16)组成,以生成低维潜矢量
图 3.2.1:编码器模型由`Conv2D(32) - Conv2D(64) - Dense(16)`组成,以生成低维潜矢量
列表 3.2.1 中的解码器对潜在向量进行解压缩,以恢复 MNIST 数字。 解码器输入级是`Dense`层,它将接受潜在矢量。 单位的数量等于从编码器保存的`Conv2D`输出尺寸的乘积。 这样做是为了便于我们调整`Dense``Dense`层的输出大小,以最终恢复原始 MNIST 图像尺寸。
......@@ -254,7 +254,7 @@ plt.show()
![A screenshot of a cell phone Description automatically generated](img/B14853_03_04.png)
图 3.2.2:解码器模型由 Dense(16)-Conv2DTranspose(64)-Conv2DTranspose(32)-Conv2DTranspose(1)组成。 输入是经过解码以恢复原始输入的潜矢量
图 3.2.2:解码器模型由`Dense(16) - Conv2DTranspose(64) - Conv2DTranspose(32) - Conv2DTranspose(1)`组成。 输入是经过解码以恢复原始输入的潜矢量
通过将编码器和解码器连接在一起,我们可以构建自编码器。“图 3.2.3”说明了自编码器的模型图:
......@@ -276,13 +276,13 @@ plt.show()
![A close up of a mans face Description automatically generated](img/B14853_03_07.png)
图 3.2.5:MNIST 数字分布与潜在代码尺寸 z [0]和 z [1]的关系。 原始照片可以在本书的 GitHub 存储库中找到,网址为 https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras/blob/master/chapter3-autoencoders/README.md
图 3.2.5:MNIST 数字分布与潜在代码尺寸`z[0]``z[1]`的关系。 原始照片可以在本书的 [GitHub 存储库](https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras/blob/master/chapter3-autoencoders/README.md)中找到。
在“图 3.2.5”中,我们可以看到特定数字的潜矢量聚集在空间的某个区域上。 例如,数字 0 在左下象限中,而数字 1 在右上象限中。 这种群集在图中得到了反映。 实际上,同一图显示了导航或从潜在空间生成新数字的结果,如图“图 3.2.5”所示。
例如,从中心开始,向右上象限改变 2 维潜矢量的值,这表明数字从 9 变为 1。这是可以预期的,因为从“图 3.2.5”开始,我们可以看到数字 9 簇的潜在代码值在中心附近,数字 1 簇的潜在代码值在右上象限。
对于“图 3.2.5”和“图 3.2.6”,我们仅研究了每个潜在矢量维在-4.0 和+4.0 之间的区域:
对于“图 3.2.5”和“图 3.2.6”,我们仅研究了每个潜在矢量维在 -4.0 和 +4.0 之间的区域:
![](img/B14853_03_08.png)
......@@ -590,7 +590,7 @@ Image.fromarray(imgs).save('corrupted_and_denoised.png')
plt.show()
```
“列表 3.3.1”显示了去噪自编码器,该编码器已添加到官方 Keras GitHub 存储库中。 使用相同的 MNIST 数据集,我们可以通过添加随机噪声来模拟损坏的图像。 添加的噪声是高斯分布,平均值为![](img/B14853_03_022.png),标准偏差为![](img/B14853_03_023.png)。 由于添加随机噪声可能会将像素数据推入小于 0 或大于 1 的无效值,因此像素值会被裁剪为[0.1,1.0]范围。
“列表 3.3.1”显示了去噪自编码器,该编码器已添加到官方 Keras GitHub 存储库中。 使用相同的 MNIST 数据集,我们可以通过添加随机噪声来模拟损坏的图像。 添加的噪声是高斯分布,平均值为![](img/B14853_03_022.png),标准偏差为![](img/B14853_03_023.png)。 由于添加随机噪声可能会将像素数据推入小于 0 或大于 1 的无效值,因此像素值会被裁剪为`[0.1, 1.0]`范围。
其他所有内容实际上都与上一节中的自编码器相同。 我们将使用相同的 MSE 损失函数和 Adam 优化器。 但是,训练的时期数已增加到 10。这是为了进行足够的参数优化。
......@@ -610,11 +610,11 @@ plt.show()
![](img/B14853_03_12.png)
图 3.4.1:为 Mayon 火山的灰度照片添加颜色。 着色网络应通过向灰度照片添加颜色来复制人类的能力。 左照片是灰度的。 正确的照片是彩色的。 原始彩色照片可以在本书的 GitHub 存储库中找到,网址为 https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras/blob/master/chapter3-autoencoders/README.md
图 3.4.1:为 Mayon 火山的灰度照片添加颜色。 着色网络应通过向灰度照片添加颜色来复制人类的能力。 左照片是灰度的。 正确的照片是彩色的。 原始彩色照片可以在本书的 [GitHub 存储库](https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras/blob/master/chapter3-autoencoders/README.md)中找到。
对于自编码器,一种简单的自动着色算法似乎是一个合适的问题。 如果我们可以使用足够数量的灰度照片作为输入并使用相应的彩色照片作为输出来训练自编码器,则可能会在正确应用颜色时发现隐藏的结构。 大致上,这是去噪的反向过程。 问题是,自编码器能否在原始灰度图像上添加颜色(良好的噪点)?
“列表 3.4.1”显示了着色自编码器网络。 着色自编码器网络是我们用于 MNIST 数据集的降噪自编码器的修改版本。 首先,我们需要一个彩色照片的灰度数据集。 我们之前使用过的 CIFAR10 数据库进行了 50,000 次训练和 10,000 次测试,可以将 32×32 RGB 照片转换为灰度图像。 如下清单所示,我们可以使用`rgb2gray()`函数在 R,G 和 B 分量上应用权重,以从彩色转换为灰度:
“列表 3.4.1”显示了着色自编码器网络。 着色自编码器网络是我们用于 MNIST 数据集的降噪自编码器的修改版本。 首先,我们需要一个彩色照片的灰度数据集。 我们之前使用过的 CIFAR10 数据库进行了 50,000 次训练和 10,000 次测试,可以将`32×32` RGB 照片转换为灰度图像。 如下清单所示,我们可以使用`rgb2gray()`函数在 R,G 和 B 分量上应用权重,以从彩色转换为灰度:
“列表 3.4.1”:`colorization-autoencoder-cifar10-3.4.1.py`
......@@ -882,7 +882,7 @@ plt.show()
在本章中,我们已经介绍了自编码器,它们是将输入数据压缩为低维表示形式的神经网络,以便有效地执行结构转换,例如降噪和着色。 我们为 GAN 和 VAE 的更高级主题奠定了基础,我们将在后面的章节中介绍它们。 我们已经演示了如何从两个构建模块模型(编码器和解码器)实现自编码器。 我们还学习了如何提取输入分布的隐藏结构是 AI 的常见任务之一。
一旦学习了潜在代码,就可以对原始输入分布执行许多结构操作。 为了更好地了解输入分布,可以使用低级嵌入(类似于本章内容)或通过更复杂的降维技术(例如 t)来可视化潜在矢量形式的隐藏结构。 -SNE 或 PCA
一旦学习了潜在代码,就可以对原始输入分布执行许多结构操作。 为了更好地了解输入分布,可以使用低级嵌入(类似于本章内容)或通过更复杂的降维技术(例如 t-SNE 或 PCA)来可视化潜在矢量形式的隐藏结构
除了去噪和着色外,自编码器还用于将输入分布转换为低维潜矢量,可以针对其他任务(例如,分割,检测,跟踪,重建和视觉理解)进一步对其进行处理。 在“第 8 章”,“变分自编码器(VAE)”中,我们将讨论 VAE,它们在结构上与自编码器相同,但具有可解释的潜在代码,这些代码可以产生连续的潜在矢量投影,因此有所不同。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册