研究人员发现,卷积神经网络(CNN)之所以在处理图像上有优势,是因为可以提取隐藏在图像中的空间信息,因此很自然地想到如果可以使用 CNN 构造编码器和解码器网络,会比其他自动
前面章节中已经解释了卷积和最大池化的概念,本节将以此为基础来理解卷积自编码器是如何工作的。
CAE 的编码器和解码器都是 CNN 网络,编码器的卷积网络学习将输入编码为一组信号,然后解码器 CNN 尝试重构来自自动编码机的输入。其中 CNN 作为通用特征提取器进行工作,学习如何最好地捕捉输入特征。
通过前面的学习我们知道,随着卷积层的添加,传递到下一层的空间尺寸信息在减小,但是在自编码器中,重构图像的大小和深度应与输入图片相同,这意味着解码器应该以某种方式调整图像大小和卷积来重构原始图像。
转置卷积层能够增加空间尺寸和卷积,在 TensorFlow 中通过 tf.nn.conv2d_transpose 即可实现,但是转置卷积层会导致最终图像中出现伪影。Augustus Odena 等人表明使用最近邻或双线性插值(上采样)紧跟着一个卷积层的方式可以避免这些伪影,他们采用最近邻差值(tf.image.resize_images)实现,最终取得了非常好的结果,在这里将使用相同的方法。
具体做法
-
导入必要的模块:
-
加载输入数据:
-
定义网络参数,同时也计算每个最大池化层的输出空间维度,这些信息在解码器网络中对图像进行上采样:
-
为输入(噪声图像)和目标(对应的清晰图像)创建占位符:
-
建立编码器和解码器网络:
-
建立会话:
-
根据给定输入调整模型:
-
网络学习误差如下:
效果图如下:
-
图像重构:
下图是前面代码的输出:
-
关闭会话: