自编码器初探——深度自编码器_深度自编码 crbm-程序员宅基地

技术标签: 自编码器  

因为最近在研究对抗自编码器,所以想对编码器有个大致的了解,于是就从最基础的自编码器开始看起,正好熟悉一下keras模型的搭建以及其各种各样的函数和层的调用,最后还会介绍一下如何用tensorboard将训练过程中的一些误差和精度可视化。
简单介绍一下自编码器,按照我的理解(理解可能会不是很到位,大家有问题可以留言),我们所说的自编码器通常包含了编码(encoder)和解码(decoder)两部分。编码部分呢就是相当于数据压缩,将输入的高维数据(这里所谓的高维指的是数据的属性变量较多,不是高维张量的意思)通过一定的函数使得其转化为低维的潜在特征数据(我觉着这些潜在特征没有具体的物理含义),只不过这些潜在特征能够包含原始数据中的大部分主要特征,对于一些微小的特征可能就丢失了。所以说经过编码器压缩后的特征用处很大,可以将它用于数据传输(会比传送大量原始数据快得多),也可以用这些潜在的特征构建原始数据的特征空间,对一些工业场景做过程监测或是故障诊断。当然自编码器的发明初衷就是为了加速数据传输,但是在接收端接受到了潜在的特征,如何将其还原呢?答案就是解码器,通过解码器将数据尽可能少失真的还原,所以这一方面来看解码器和编码器是个对偶的过程。关于自编码器就先简单的介绍到这里,下面我们来说一说深度自编码器的结构。
其实我觉得深度自编码器本质还是多层感知机(MLP)只不过隐层数目稍微多一点。下面就是我搭建的深度自编码器的结构。
在这里插入图片描述
因为是mnist数据集,都是28*28的灰度图,但是我们想将其看作数据进行操作而不是图像,所以首先将其reshape成一维张量(784,)

x_train = x_train.reshape(-1,784)#60000*784
x_test  = x_test.reshape(-1,784)

紧接着再送入神经网络之前要进行一下数据的标准化,我们将0-255间的灰度像素除以255化为0-1之间,这样在训练时可以加速梯度的收敛。

#将灰度图进行归一化0-1,加速收敛
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

接下来我们可以给数据手动加上高斯噪声

x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape)
x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape)
x_train_noisy = np.clip(x_train_noisy, 0., 1.)#输出限幅
x_test_noisy = np.clip(x_test_noisy, 0., 1.)

至此数据就准备好了,下面开始搭建网络模型

# 使用一个全连接网络来搭建编码器
encoded1 = Dense(encoding_dim1, activation='relu',input_dim=784,name='Input')
encoded2 = Dense(encoding_dim2, activation='relu',name='encoder_feature1')
encoded3 = Dense(encoding_dim3, activation='relu',name='encoder_feature2')
encoded4 = Dense(encoding_dim4, activation='relu',name='encoder_feature3')
# 使用一个全连接网络来对编码器进行解码
decoded1 = Dense(encoding_dim3, activation='relu',name='decoder_feature1')
decoded2 = Dense(encoding_dim2, activation='relu',name='decoder_feature2')
decoded3 = Dense(encoding_dim1, activation='relu',name='decoder_feature3')
decoded4 = Dense(784, activation='sigmoid',name='Output')
# 构建keras模型
AutoEncoder = Sequential()
AutoEncoder.add(encoded1)
AutoEncoder.add(encoded2)
AutoEncoder.add(encoded3)
AutoEncoder.add(encoded4)
AutoEncoder.add(decoded1)
AutoEncoder.add(decoded2)
AutoEncoder.add(decoded3)
AutoEncoder.add(decoded4)

网络搭好了之后,我们来看一下模型的结构

AutoEncoder.summary()#画出模型的结构图

在这里插入图片描述
接下来就可以编译模型,训练了。
下图是原图和经过自编码器重构图的对比
在这里插入图片描述
可以看出深度自编码器的去噪效果还是挺好的。
接下来我们用tensorboard来查看训练日志。要在训练里加上一句话。

AutoEncoder.fit(x_train_noisy,x_train,epochs=10,batch_size=50,shuffle=True,verbose=1,callbacks=[TensorBoard(log_dir='my_log_dir')])

tensorflow作为后端就会生成一个叫my_log_dir的文件夹来保存训练日志,接着打开windows命令行先输入activate tensorflow1.12.0激活tensorflow虚拟环境,然后输入tensorboard --logdir=E:\MY_Python\AutoEncoder,注意这里的AutoEncoder文件夹是比my_log_dir文件夹大一级的,然后就会出现一个网页连接http://localhost:6006/,将其复制到Microsoft Edge浏览器或者是谷歌浏览器打开即可出现tensorboard界面(注意其他浏览器可能打不开)。
在这里插入图片描述
第一个图是训练集的loss,第二个图是验证集的loss,从第二个图可以看出来训练集的loss一直在减小,但验证集的loss反而在增加了,由此可见是过拟合了。可以加入一些正则化或者是dropout等方法处理。深度自编码器比较基础,还有一些效果出多的比如卷积自编码器、稀疏自编码器等,好了,今天就写到这了,过两天写变分自编码器。
下面是全部代码
https://github.com/JianfengZhang112358/AutoEncoder

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39004111/article/details/104119523

智能推荐

div背景透明度动态改变的效果_css动态增加div透明度-程序员宅基地

文章浏览阅读338次。目标:使用定时器实现div背景色的透明度动态改变注意:这里没有进行兼容处理,别使用低版本的ie游览器!!!代码: <!doctype html><html> <head> <title>div背景透明度动态改变的效果</title> <meta charset="utf-8" /> </head> <body> <div class="_css动态增加div透明度

使用yum install和reposync下载rpm安装包以及wget和curl下载文件_yum下载-程序员宅基地

文章浏览阅读5k次。记录:311场景:在CentOS 7.9操作系统,使用yum install --downloadonly命令下载rpm安装包和依赖包;使用reposync命令下载远程yum源镜像仓库;使用wget命令下载指定文件;使用curl下载指定文件。_yum下载

解决spring-boot-maven-plugin:2.2.1.RELEASE:repackage failed: Unable to find main class找不到或无法加载主类_spring-boot-maven-plugin unable to find main class-程序员宅基地

文章浏览阅读2.1k次,点赞6次,收藏3次。完美解决问题原文链接:https://blog.csdn.net/WillyWithouty/article/details/116120785解决:Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.2.1.RELEASE:repackage failed: Unable to find main class这个大坑整了我一晚上,现在解决了做个总结:首先我们看报错原因,为什么会说不能找到主类_spring-boot-maven-plugin unable to find main class

C++:重定义:符号重定义:变量重定义(二):解决变量重定义(const static)_const变量和普通变量会重定义吗-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏2次。C++:重定义:符号重定义:变量重定义(二):解决变量重定义_const变量和普通变量会重定义吗

EndNote登录出现的一个问题_平板上的endnote注册显示not valid-程序员宅基地

文章浏览阅读1.5w次,点赞11次,收藏5次。EndNote登录出现的一个问题之前在电脑上装了个EndNoteX9,然后就想把自己在另一个电脑上整理的一些文献同步到现在这个电脑上,结果同步的时候发现莫名其妙自己的账户名和密码无效,这给我气的,立马去百度查咋回事,结果没找到原因;然后一直保持了很久不能同步的状态,昨天又想到这个事情,狠了狠心卸载,然后下了个20重装;果然还是不行:点Sync Status就显示 ‘The Username/password specified is not valid’;然后各种试:先是看看密码错了没,重新输_平板上的endnote注册显示not valid

HBuilder各种快捷键-程序员宅基地

文章浏览阅读534次。另外还有一些实用的组合键:Alt+T→V  (检验语法文档)Alt+L→H  (代码历史版本)Hbuilder也要吐槽一下:1.打开相对慢。2.新建文件,为什么不能存放到电脑的目录。3.emmet输入 w100,变成了w1→white-space: ;,弄得每次都要w→Tab→再输入100px,这个体验超级繁琐。4.style,script标签默认就不要带'type=*..._builder快速打出1-100

随便推点

理解和使用索引+事务+存储引擎(Mysql5.7)_mysql5.7 的需要事务如何选取引擎-程序员宅基地

文章浏览阅读210次。目录1. 索引概述2. 存储引擎概述3. 事务概述1. 索引概述2. 存储引擎概述3. 事务概述_mysql5.7 的需要事务如何选取引擎

实现用户的登录,并且登录后显示用户名_jquery - 登陆成功后,右上角显示用户名怎么做-程序员宅基地

文章浏览阅读1.7w次,点赞13次,收藏125次。利用servlet,jsp实现用户的登录,并且登录后显示用户名(连接数据库)显示用户名这里是通过session传递数据,登陆成功后点击退出时要清除页面session。使用软件:tomcat-8.5.34,mysql,java我们一共需要写:位于src下的服务器端用于登录的LoginServlet,登陆成功后用于退出的SuccessServlet位于web下的前端登录页面login.html,登陆成功后的页面success.jsp,登录失败的页面error.html;首先我们来写登录的服务器端_jquery - 登陆成功后,右上角显示用户名怎么做

西门子TIA V17发布,附下载链接<EKB>_wincccomfort v17百度网盘-程序员宅基地

文章浏览阅读7.5k次。3 Startdrive V16相关下载链接可以通过如下网址获取软件和相关的手册信息:Startdrive V16 下载地址:https://support.industry.siemens.com/cs/af/en/view/109771710Startdrive V17下载地址:链接:https://pan.baidu.com/s/1jw3N_yjQ1jYefRd8dxgvdQ提取码:JNBSS120 Start..._wincccomfort v17百度网盘

Linux Camera Driver(1):简介_rv1126 dts 配置双目-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏18次。Sensor驱动(具有Media Controller属性)位于kernel/drivers/media/i2c目录。Sensor驱动与RKCIF或者RKISP驱动最大程度上独立,二者异步注册,在dts中由remote-endpoint声明连接关系。Sensor一般作为Sub Device并通过pad与rkcif,rkisp或者MIPI Dphy驱动链接在一起。按照datasheet编写上电时序,主要包括vdd,reset,powerdown,clk等。_rv1126 dts 配置双目

记录spring-cloud-gateway获取post请求body参数,以及后端服务处理后的响应参数过程 gateway:2.2.0.RELEASE_spring-cloud gatway post 请求转义-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏29次。介绍一下框架版本spring-boot:2.2.1.RELEASEspring-cloud:Hoxton.RELEASE(2.2.0.RELEASE)spring-cloud-gateway:2.2.0.RELEASE在网上找了很多版本的代码,不起作用,要么获取不到body数据,要么重新封装request到后端服务,报文丢失或者最大1024b数据,而且代码繁琐。之前参考京东大神的代码,挨着试了一遍,发现版本不对,已经不能用了,附上链接https://blog.csdn.net/tianya_spring-cloud gatway post 请求转义

istio简介和基础组件原理(服务网格Service Mesh)-程序员宅基地

文章浏览阅读7.2w次,点赞49次,收藏340次。Istio简介 Istio:一个连接,管理和保护微服务的开放平台。 按照isito文档中给出的定义: Istio提供一种简单的方式来建立已部署的服务的网络,具备负载均衡,服务到服务认证,监控等等功能,而不需要改动任何服务代码。简单的说,有了Istio,你的服务就不再需要任何微服务开发框架(典型如Spring Cloud,Dubbo),也不再需要自己手动实现各种复杂的服务..._istio