[自编码器:理论+代码]:自编码器、栈式自编码器、欠完备自编码器、稀疏自编码器、去噪自编码。。。

[⾃编码器:理论+代码]:⾃编码器、栈式⾃编码器、⽋完备⾃编码器、稀疏⾃编码器、去噪⾃编码。。。
写在前⾯
因为时间原因本⽂有些图⽚⾃⼰没有画,来⾃⽹络的图⽚我尽量注出原链接,但是有的链接已经记不得了,如果有使⽤到您的图⽚,请联系我,必注释。
⾃编码器及其变形很多,本篇博客⽬前主要基于普通⾃编码器、栈式⾃编码器、⽋完备⾃编码器、稀疏⾃编码器和去噪⾃编码器,会提供理论+实践(有的理论本⼈没有完全理解,就先没有写上,后更)。另外,关于收缩⾃编码器、变分⾃编码器、CNN⾃编码器、RNN⾃编码器及其⾃编码器的应⽤,后更。
本⽂展⽰的所有完整代码详见:
(⽬前只有Keras版本,有时间会写Tensorflow版本)
⽂章较长,PDF版点击链接:
⼀、⾃编码器(Autoencoder, AE )
1、⾃编码器的结构和思想罗迪克发球
⾃编码器是⼀种⽆监督的数据维度压缩和数据特征表达⽅法。
⾃编码器是神经⽹络的⼀种,经过训练后能尝试将输⼊复制到输出。⾃编码器由编码器和解码器组成,如下图所⽰(图⽚来源:):表⽰编码器,表⽰解码器,⾃编码的⽬标便是优化损失函数,也就是减⼩图中的Error。
2、⾃编码器和前馈神经⽹络的⽐较
⼆者的区别和联系如下:
(1)⾃编码器是前馈神经⽹络的⼀种,最开始主要⽤于数据的降维以及特征的抽取,随着技术的不断发展,现在也被⽤于⽣成模型中,可⽤来⽣成图⽚等。
(2)前馈神经⽹络是有监督学习,其需要⼤量的标注数据。⾃编码器是⽆监督学习,数据不需要标注因此较容易收集。
(3)前馈神经⽹络在训练时主要关注的是输出层的数据以及错误率,⽽⾃编码的应⽤可能更多的关注中间隐层的结果。
3、⾃编码器和受限玻尔兹曼机的⽐较
关于受限玻尔兹曼机的博客请参见:。
⼆者的区别和联系如下:
(1)⾃编码器和受限⾃编码器的相同点如下:①都起到了降维的作⽤;②都可以⽤来对神经⽹络进⾏预训练;③训练都是⽆监督的。
(2)⾃编码器和受限⾃编码器的不同点如下:①⾃编码器希望通过⾮线性变换到输⼊数据的特征表⽰,其重构的是输⼊分布与reconstruct分布的KL距离,它是某种确定论性的模型;⽽RBM则是围绕概率分布进⾏的,它通过输⼊数据的概率分布来提取中间层表⽰,它是某种概率论性的模型。②AE使⽤的是BP算法进⾏优化,⽽RBM是基于概率模型,使⽤CD算法进⾏优化。
4、普通⾃编码器存在的问题
h =f (x )r =g (h )=g (f (x ))L (x ,g (f (x ))
在普通的⾃编码器中,输⼊和输出是完全相同的,因此输出对我们来说没有什么应⽤价值,所以我们希望利⽤中间隐层的结果,⽐如,可以将其作为特征提取的结果、利⽤中间隐层获取最有⽤的特性等。
但是如果只使⽤普通的⾃编码器会⾯临什么问题呢?⽐如,输⼊层和输出层的维度都是5,中间隐层的维度也是5,那么我们使⽤相同的输⼊和输出来不断优化隐层参数,最终得到的参数可能是这样:的参数为1,其余参数为0,也就是说,中间隐层的参数只是完全将输⼊记忆下来,并在输出时将其记忆的内容完全输出即可,神经⽹络在做恒等映射,产⽣数据过拟合。如下图所⽰(图
⽚来源:):
上图是隐层单元数等于输⼊维度的情况,当然,如果是隐层单元数⼤于输⼊维度,也会发⽣类似的情况,即当隐层单元数⼤于等于输⼊维度时,⽹络可以采⽤完全记忆的⽅式,虽然这种⽅式在训练时精
度很⾼,但是复制的输出对我们来说毫⽆意义。
因此,我们会给隐层加⼀些约束,如限制隐藏单元数、添加正则化等,后⾯后介绍。
5、⾃编码器实现与结果分析
(1)实现框架: Keras
(2)数据集: Mnist⼿写数字识别
(3)关键代码:
def train(x_train):
"""
build autoencoder.
乙烯利:param x_train:  the train data
:return: encoder and decoder
小不点奇迹
"""
# input placeholder
input_image = Input(shape=(ENCODING_DIM_INPUT, ))
# encoding layer
hidden_layer = Dense(ENCODING_DIM_OUTPUT, activation='relu')(input_image)
# decoding layer
decode_output = Dense(ENCODING_DIM_INPUT, activation='relu')(hidden_layer)
# build autoencoder, encoder, decoder
autoencoder = Model(inputs=input_image, outputs=decode_output)
encoder = Model(inputs=input_image, outputs=hidden_layer)
# compile autoencoder
autoencoderpile(optimizer='adam', loss='mse')
# training
autoencoder.fit(x_train, x_train, epochs=EPOCHS, batch_size=BATCH_SIZE, shuffle=True)
return encoder, autoencoder
x 1−>a 1,x 2−>a 2,…
(4)代码分析:
Keras封装的⽐较厉害,所以傻⽠式编程,这⾥是最简单的⾃编码器,其输⼊维度是28*28=784,中间单隐层的维度是2,使⽤的激活函数是Relu,返回encoder和autoencoder。encoder部分可以⽤于降维后的可视化,或者降维之后接分类等,autoencoder可以⽤来⽣成图⽚等(这部分代码git上都有)。结构见图如下:
(5)结果展⽰:
(i)Eencoder结果的可视化如图:
上图中不同表⽰表⽰不同的数字,由图可知,⾃编码器降维之后的结果并不能很好地表⽰10个数字。
(ii)autoencoder还原之后的图⽚和原图⽚对⽐如下:
上图说明,autoencoder的⽣成结果不是很清晰。
⼆、栈式⾃编码器(Stack Autoencoder)
1、栈式⾃编码器思想
栈式⾃编码器⼜称为深度⾃编码器,其训练过程和深度神经⽹络有所区别,下⾯是基于栈式⾃编码器的分类问题的训练过程(图⽚来⾃台⼤李宏毅⽼师的PPT):
即过程如下:
⾸先,训练784->1000->784的⾃编码器,⽽后已经固定已经训练好的参数和1000维的结果,训练第⼆个⾃编码器:1000->1000-
>1000,⽽后固定已经训练好的参数和训练的中间层结果,训练第三个⾃编码器:1000->500->1000,固定参数和中间隐层的结果。此时,前3层的参数已经训练完毕,此时,最后⼀层接⼀个分类器,将整体⽹络使⽤反向传播进⾏训练,对参数进⾏微调。这便是使⽤栈式⾃编码器进⾏分类的整体过程。免耕播种机
注:encoder和decoder的参数可以是对称的,也可以是⾮对称的。
2、栈式⾃编码器的特点
①增加隐层可以学到更复杂的编码,每⼀层可以学习到不同的信息维度。
②若层数太深,encoder过于强⼤,可以将学习将输⼊映射为任意数(然后decoder学习其逆映射)。这⼀编码器可以很好的重建数据,但它并没有在这⼀过程中学到有⽤的数据表⽰。
3、栈式⾃编码器和深度信念⽹络的异同点
①⾃编码器 栈式⾃编码器;受限玻尔兹曼机 深度信念⽹络
②栈式⾃编码器和深度信念⽹络都是逐层训练。
③栈式⾃编码器和深度信念⽹络的训练⽅法不同,栈式⾃编码器使⽤BP算法训练参数,深度信念⽹络使⽤的是对⽐散度算法。
4、栈式⾃编码器实现与结果分析
(1)实现框架: Keras
(2)数据集: Mnist⼿写数字识别
(3)关键代码:
def train(x_train):
# input placeholder
input_image = Input(shape=(ENCODING_DIM_INPUT, ))
# encoding layer
encode_layer1 = Dense(ENCODING_DIM_LAYER1, activation='relu')(input_image)
encode_layer2 = Dense(ENCODING_DIM_LAYER2, activation='relu')(encode_layer1)
encode_layer3 = Dense(ENCODING_DIM_LAYER3, activation='relu')(encode_layer2)
encode_output = Dense(ENCODING_DIM_OUTPUT)(encode_layer3)
高官公共情人 李薇
# decoding layer
decode_layer1 = Dense(ENCODING_DIM_LAYER3, activation='relu')(encode_output)
decode_layer2 = Dense(ENCODING_DIM_LAYER2, activation='relu')(decode_layer1)
decode_layer3 = Dense(ENCODING_DIM_LAYER1, activation='relu')(decode_layer2)
decode_output = Dense(ENCODING_DIM_INPUT, activation='tanh')(decode_layer3)
# build autoencoder, encoder
autoencoder = Model(inputs=input_image, outputs=decode_output)
encoder = Model(inputs=input_image, outputs=encode_output)
# compile autoencoder
autoencoderpile(optimizer='adam', loss='mse')
# training
autoencoder.fit(x_train, x_train, epochs=EPOCHS, batch_size=BATCH_SIZE, shuffle=True)
return encoder, autoencoder
栈式⾃编码器相当于深度⽹络的过程,主要注意维度对应即可,另外,这⾥设置的encoder和decoder的维度是对称的。其架构图如下:
(4)结果展⽰:甲状腺鳞状细胞癌
(i)Eencoder结果的可视化如图:
上图中不同表⽰表⽰不同的数字,由图可知,栈式⾃编码器的效果相⽐较普通⾃编码器好很多,这⾥基本能将10个分类全部分开。

本文发布于:2024-09-21 17:38:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/147044.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:编码器   数据   训练   栈式   隐层   深度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议