使用Tensorflow的深度自编码器!
点击上方关注,All in AI中国
在本教程中,我们将探索一种名为深度自编码器的无监督学习神经网络。
因此,自动、编码器是用于在输出层再现输入的深度神经网络,即输出层中的神经元的数量与输入层中的神经元的数量完全相同。可以看下下面的图像。
该图像表示典型的深度自编码器的结构。自编码器体系结构的目标是在输出层创建输入的表示,使得两者尽可能接近(相似)。但是,自编码器的实际使用是用于确定具有最低数据丢失量的输入数据的压缩版本。
我的意思是:您一定听说过一个术语,开发机器学习项目称为主成分分析。PCA (principal Component Analysis)即主成成分分析的概念是找到用于训练模型的最佳和相关参数,其中数据集具有大量参数。
自编码器以类似的方式工作,架构的编码器部分将输入数据分解为压缩版本,确保重要数据不会丢失,但数据的整体大小会显著减小。这个概念称为降维。
这个概念的缺点是,数据压缩是一个黑盒子,即我们无法确定其压缩版本中的数据结构。请记住,假设我们有一个包含5个参数的数据集,可以在这些数据上训练一个自编码器。编码器不会省略某些参数以获得更好的表示,但它将参数融合在一起以创建压缩版本但参数比较少(从5开始将参数数量减少到3)。
因此,自编码器有两个部分,即编码器和解码器。
编码器压缩输入数据,并且解码器反过来产生数据的未压缩版本以尽可能准确地创建输入的重建。
我们将使用Tensorflow的图层API创建自编码器神经网络并在mnist数据集上对其进行测试。所以,让我们开始!!
首先,我们导入相关的库并读入mnist数据集。如果数据集存在于本地计算机上,那么它将很好,否则将通过运行以下命令自动下载。
接下来,我们为方便起见创建一些常量,并事先声明我们的激活函数。mnist数据集中的图像大小为28x28像素,即784像素,我们将其压缩为196像素。您可以随时更深入地进一步缩小像素大小。但是,压缩太多可能会导致自动编码器丢失信息。
现在,我们为每个图层的权重和偏差创建变量。然后,我们使用先前声明的激活函数创建图层。
通常不使用tf.variance_scaling_initializer()。但是,我们在这里使用它是因为我们正在处理不断变化的输入大小。因此,占位符张量形状(占位符用于输入批处理)根据输入大小的形状调整自身,从而阻止我们遇到任何维度错误。通过简单地将先前隐藏层作为输入馈送到激活函数(ReLu)中来创建隐藏层,其具有相关权重和偏差。
我们将使用RMSE损失函数用于此神经网络,并将其传递给Adam优化器。您可以随时使用这些来获得有趣的结果。
现在,我们定义了epochs的数量和批处理大小并运行会话。我们使用mnist中的实用程序函数来获取每个新批处理:mnist.train.next_batch()。此外,我们将在每个时期之后输出训练损失以监测其训练。
最后,我们将编写一个小的绘图函数来绘制原始图像和重建图,以查看我们的模型的工作情况。
最终输出
在这里,我们可以看到重建并不是完美的,但非常接近原始图像。注意,2的重构看起来像是3,这是由于压缩时信息丢失造成的。
我们可以通过超参数优化来改进自动编码器模型,并且还可以通过在GPU加速器上进行训练来改进它。
好的,这是Tensorflow上从头开始构建的深度(或堆叠)自编码器模型。有关完整代码,请单击https://github.com/Tathagatd96/Deep-Autoencoder-using-Tensorflow。
作者:Tathagat Dasgupta