Tensorflow基于CNN的AutoEncoder
完整代码:https://github.com/SongDark/cnn_autoencoder_mnist
一、概述
AutoEncoder属于无监督学习,由一个编码器Encoder和一个解码器Decoder组成,是一个Encoder-Decoder结构,它学习的目标是还原输入,不需要提供标签。
1.1 AutoEncoder和PCA的关系
AutoEncoder和PCA有点像,PCA是对标准化的输入,用SVD的方式计算一个矩阵 W W W,对输入进行线性变换,AutoEncoder是非线性的。理论上,AutoEncoder的Reconstruct loss会比PCA的更低,因为它非线性,信息丢失会更少。
1.2 AutoEncoder恢复的一定不模糊吗
不一定,根据我的经验,一般的AE恢复出来的图像很糊。De-Noising AutoEncoder能稍微缓解,它在输入加噪,要求Decoder恢复出加噪前的输入,强迫AE具有去噪功能。
1.3 AutoEncoder可以用来做什么
- 压缩。图像、词向量等高维流型,压缩成低维。
- 预训练。用不带标签的样本,对分类器逐层用AE做预训练,作为分类器的初始参数,然后再fine-tune。
二、数据源
使用Mnist作为训练数据,Mnist的获取可以参考这篇博客:
获取MNIST数据的几种方法
三、Encoder和Decoder结构
Encoder输入图片输出编码,Decoder输入编码输出图片,因此用多层卷积结构实现Encoder,用多层解卷积结构实现Decoder。下面代码实现的结构,支持任意指定编码维度(output_dim
)。
class CNN_Encoder(BasicBlock):
def __init__(self, output_dim, sn=False, name=None):
super(CNN_Encoder, self).__init__(None, name or "CNN_Encoder")
self.output_dim = output_dim
self.sn = sn # spectral norm
def __call__(self, x, sn=False, is_training=True, reuse=False):
with tf.variable_scope(self.name, reuse=reuse):
net = lrelu(conv2d(x, 64, 4, 4, 2, 2, sn=self.sn, padding="SAME", name="conv1"), name="l1")
net = lrelu(bn