【DL笔记】AutoEncoder详解(一)

前言

AutoEncoder是深度学习的另外一个重要内容,并且非常有意思,神经网络通过大量数据集,进行end-to-end的训练,不断提高其准确率,而AutoEncoder通过设计encode和decode过程使输入和输出越来越接近,是一种无监督学习过程。

AutoEncoder

Introduction

AutoEncoder包括两个过程:encode和decode,输入图片通过encode进行处理,得到code,再经过decode处理得到输出,有趣的是,我们控制encode的输出维数,就相当于强迫encode过程以低维参数学习高维特征,这导致的结果和PCA类似。

AutoEncoder的目的是使下图中的输入x和输出x_head越相似越好,这就需要在每次输出之后,进行误差反向传播,不断优化。

高维数据对于我们的感官体验总是不友好,如果我们将输入降低至二维,放在二维平面中就会更加直观,下图是MNIST数据集做AutoEncoder:

上面是PCA的结果,下面是AutoEncoder的结果,在二维中结果很清晰。

encode和decode两个过程可以理解成互为反函数,在encode过程不断降维,在decode过程提高维度。当AutoEncoder过程中用卷积操作提取特征,相当于encode过程为一个深度卷积神经网络,好多层的卷积池化,那么decode过程就需要进行反卷积和反池化,那么,反卷积和反池化如何定义呢?

Unpooling

池化过程实际上就是降维过程,假设图片大小为32x32,池化大小为2x2,就相当于将图片中相邻的2x2个像素点替换为四个点中最大数值(max-pooling),池化处理之后得到的图片大小为16x16,Unpooling过程则需要将16x16的图片变为32x32,其实在池化过程中,会标记2x2像素点中最大值的位置,在Unpooling过程将最大值还原,其他位置填0。

以上并不是Unpooling的唯一做法,在Keras中,不会记住最大值的位置,而是将所有像素均以最大值填充。

Deconvolution

卷积过程是一个矩阵在另一个矩阵上面做滑动运算,反卷积也是一样,实际上,反卷积就是卷积,看下面的图,我们熟悉的是左面的卷积过程,假设有5个像素点,卷积核为3,步长为1,卷积之后生成3个feature,我们想象中的反卷积应该是中间所示的情形,由3个输入生成5个输出,如果我们将反卷积中的输入做2的padding,这样原本3个输入变成7个输入,再做卷积,生成5个输出,对比左右两侧的图,是完全相反的,所以,我们加上padding,使反卷积变成了卷积运算。

De-noising AutoEncoder

对于AutoEncoder,每一次的训练都是自身的对比,这回造成输出和输入越来越类似,而对同种类的其他图片表现不敏感,于是,De-noising AutoEncoder派上了用场,如下图所示,在输入之前,先将图片加入随机噪声,这样每次的输入都会略有差异,然后将带有噪声的图片进行AutoEncoder,将输出的y与加噪声之前的图片进行比较,这样训练出来的y就具有抗噪声的能力,在以图搜图的场景下也就提高了泛化能力。

 

参考资料

http://blog.csdn.net/changyuanchn/article/details/15681853

http://blog.csdn.net/acdreamers/article/details/44657745

YouTube李宏毅老师的深度学习视频

http://www.cnblogs.com/tornadomeet/archive/2013/03/19/2970101.html

李航《统计学习方法》

  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
好的,以下是一个简单的Python程序,用于实现一个基本的Autoencoder模型: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Dense from tensorflow.keras.models import Model # 定义输入层 input_layer = Input(shape=(784,)) # 定义编码层 encoded_layer = Dense(128, activation='relu')(input_layer) encoded_layer = Dense(64, activation='relu')(encoded_layer) encoded_layer = Dense(32, activation='relu')(encoded_layer) # 定义解码层 decoded_layer = Dense(64, activation='relu')(encoded_layer) decoded_layer = Dense(128, activation='relu')(decoded_layer) decoded_layer = Dense(784, activation='sigmoid')(decoded_layer) # 定义自编码器模型 autoencoder = Model(input_layer, decoded_layer) # 编译模型 autoencoder.compile(optimizer='adam', loss='binary_crossentropy') # 加载MNIST数据集 (x_train, _), (x_test, _) = tf.keras.datasets.mnist.load_data() # 数据规范化 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. # 数据展开 x_train = x_train.reshape((len(x_train), 784)) x_test = x_test.reshape((len(x_test), 784)) # 训练模型 autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test)) # 生成编码器模型 encoder = Model(input_layer, encoded_layer) # 生成解码器模型 decoder_input = Input(shape=(32,)) decoder_layer = autoencoder.layers[-3](decoder_input) decoder_layer = autoencoder.layers[-2](decoder_layer) decoder_layer = autoencoder.layers[-1](decoder_layer) decoder = Model(decoder_input, decoder_layer) # 测试模型 encoded_imgs = encoder.predict(x_test) decoded_imgs = decoder.predict(encoded_imgs) ``` 这个程序实现了一个基本的自编码器模型,用于对MNIST数据集中的手写数字图像进行编码和解码。在训练完成后,我们可以通过编码器模型来获取图像的编码表示,并通过解码器模型来重构图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值