自编码器原理概述_编码器结构及工作原理

自编码器原理概述_编码器结构及工作原理个人博客:http://www.chenjianqu.com/原文链接:http://www.chenjianqu.com/show-62.html自编码器的概念自编码器(Auto-Encoder),是一种利用反向传播算法使得输出值等于输入值的神经网络,它先将输入压缩成潜在空间表征,然后通过这种表征来重构输出。自编码器由两部分组成:编码器:这部分能将输入压缩成潜在空…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-62.html

自编码器的概念

    自编码器(Auto-Encoder),是一种利用反向传播算法使得输出值等于输入值的神经网络,它先将输入压缩成潜在空间表征,然后通过这种表征来重构输出。自编码器由两部分组成:

    编码器:这部分能将输入压缩成潜在空间表征,可以用编码函数h=f(x)表示。

    解码器:这部分能重构来自潜在空间表征的输入,可以用解码函数r=g(h)表示。

1.jpg

    整个自编码器可以用函数g(f(x)) = r来描述,其中输出r与原始输入x相近。该网络的目的是重构其输入,使其隐藏层学习到该输入的良好表征。如果输入完全等于输出,即g(f(x))=x,该网络毫无意义。所以需要向自编码器强加一些约束,使它只能近似地复制。这些约束强制模型考虑输入数据的哪些部分需要被优先复制,因此它往往能学习到数据的有用特性。一般情况下有两种约束:

    1.令隐层的维度小于输入的维度,称为不完备的(under complete)。编码器将数据降维、解码器再还原数据。类似于PCA。如果隐藏节点比可视节点(输入、输出)少的话,由于被迫的降维,自编码器会自动习得训练样本的特征(变化最大,信息量最多的维度)。

    2.令隐层的维度大于输入数据的维度,称为过完备(over complete)。如果隐藏节点数目过多,自编码器可能会习得一种“恒等函数,即直接把输入复制过去作为输出。因此需要添加其它的约束,比如正则化、稀疏性等。

 

自编码器的分类

    根据对隐层特征侧重点的不同,出现了各种不同的自编码器的变种,如下图:[https://www.zhihu.com/question/41490383/answer/103006793]

2.jpg

堆栈自动编码器:自编码器的编码器和解码器可以采用深层的架构,这就是堆栈自动编码器或者深度自动编码器,本质上就是增加中间特征层数。以前栈式自编码器的训练过程是,n个AE按顺序训练,第1个AE训练完成后,将其编码器的输出作为第2个AE的输入,以此类推。最后再对整个网络进行Fine turning。但是现在的深度学习技术已经可以直接进行多层训练而无需逐层训练。

卷积自编码器:在编码器和解码器中使用卷积层抽取和还原特征。

正则自编码器:使用的损失函数可以鼓励模型学习其他特性(除了将输入复制到输出),而不必限制使用浅层的编码器和解码器以及小的编码维数来限制模型的容量。即使模型容量大到足以学习一个无意义的恒等函数,非线性且过完备的正则自编码器仍然能够从数据中学到一些关于数据分布的有用信息。常用的正则化有L1正则化和L2正则化。L2正则化的损失函数如下图:

3.jpg

    上式中的lambda为权重衰减系数。

去噪自编码器(Denoising Auto-Encoder, DAE):接收带噪声的数据,并将未带噪声的数据作为训练目标,得到一个用于去噪的自编码器。我们可以不对对损失函数添加惩罚,而是通过改变损失函数的重构误差项,得到一个可以学习一些有用的东西的自编码器。这可以通过给输入象征添加一些噪声并使自编码器学会删除它来实现。通过这种方式,编码器将提取最重要的特征并学习数据更具鲁棒性的表示。我们可以不对对损失函数添加惩罚,而是通过改变损失函数的重构误差项,得到一个可以学习一些有用的东西的自编码器。这可以通过给输入象征添加一些噪声并使自编码器学会删除它来实现。通过这种方式,编码器将提取最重要的特征并学习数据更具鲁棒性的表示。

稀疏自编码器(Sparse Auto-Encoder,SAE):正则自编码器要求的是隐层的权重不能太大,而SAE的是要求隐层的神经元添加稀疏性限制。所谓稀疏性,就是对一对输入图像,隐藏节点中被激活的节点数(输出接近1)远远小于被抑制的节点数目(输出接近0)。那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。推导过程如下[https://blog.csdn.net/pi9nc/article/details/27711441]:

5.png

变分自编码器(VAE):与传统AE输出的隐藏层不同,其给隐藏层加了一个约束:迫使隐藏层产生满足高斯分布的变量,即均值趋于0,方差趋于1。与传统AE输出的隐藏层不同,其给隐藏层加了一个约束:迫使隐藏层产生满足高斯分布的变量,即均值趋于0,方差趋于1。

6.png

 

    除了以下介绍的几种AE,还有其它比如Contractive Auto-Encoder、Marginalized DAE等。

 

 

代码实现卷积降噪自编码器

     本代码使用fashion_mnist数据集,基于Keras实现。

  1. 加载Keras自带的fashion_mnist数据集,并对输入数据添加噪声。

from keras.datasets import fashion_mnist
import numpy as np

(x_train,_),(x_test,_)=fashion_mnist.load_data()
x_train=x_train.reshape(-1,28,28,1).astype('float32')/255.0
x_test=x_test.reshape(-1,28,28,1).astype('float32')/255.

f=0.5
#产生噪声并叠加到训练数据上 loc是均值,scale是方差
x_train_noisy=x_train+f*np.random.normal(loc=0.0,scale=1.0,size=x_train.shape)
x_test_noisy=x_test+f*np.random.normal(loc=0.0,scale=1.0,size=x_test.shape)
#限制加上噪声后的值为0-1
x_train_noisy=np.clip(x_train_noisy,0.,1.)
x_test_noisy=np.clip(x_test_noisy,0.,1.)

查看添加噪声后的效果。

%matplotlib inline
import matplotlib.pyplot as plt

n=10
plt.figure(figsize=(20,2))
for i in range(n):
    ax=plt.subplot(1,n,i+1)
    plt.imshow(x_test_noisy[i].reshape(28,28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
plt.show()

7.png

 

2.定义网络。

from keras.layers import *
from keras.models import Model,load_model

#编码器
from keras.layers import *
from keras.models import Model,load_model
#编码器
inputs=Input(shape=(28,28,1))
x=Conv2D(32,(3,3),padding='same',activation='relu')(inputs)
x=MaxPooling2D((2,2),padding='same')(x)
x=Conv2D(32,(3,3),padding='same',activation='relu')(x)
vector=MaxPooling2D((2,2),padding='same')(x)
#解码器
x=Conv2D(32,(3,3),padding='same',activation='relu')(vector)
x=UpSampling2D((2,2))(x)
x=Conv2D(32,(3,3),padding='same',activation='relu')(x)
x=UpSampling2D((2,2))(x)
outputs=Conv2D(1,(3,3),padding='same',activation='sigmoid')(x)

model=Model(inputs,outputs)
model.summary()

 

3.编译并训练网络,使用adam优化器,使用mse作为误差函数。

from keras import losses
model.compile(optimizer='adam',loss=losses.mean_squared_error)
model.fit(x_train_noisy,x_train,
         epochs=100,
          batch_size=128,
          shuffle=True
         )
model.save('AutoEncoder_Mnist.h5')

4.测试效果

#测试
%matplotlib inline
from keras.models import Model,load_model
import matplotlib.pyplot as plt
aemodel=load_model('AutoEncoder_Mnist.h5')
output_imgs=aemodel.predict(x_test_noisy)
n=10
count=0
plt.figure(figsize=(20,16))
for j in range(4):
    for i in range(n):
        ax=plt.subplot(8,n,j*2*n+i+1)#获取子图
        plt.imshow(x_test_noisy[count].reshape(28,28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
        ax=plt.subplot(8,n,j*2*n+i+1+n)
        plt.imshow(output_imgs[count].reshape(28,28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
        
        count+=1
    
    
plt.show()

 

index.png

 

 

 

参考文献

[1]量子位. 自编码器是什么?有什么用?这里有一份入门指南(附代码). https://zhuanlan.zhihu.com/p/34238979

[2] ShuYini.一文带你了解自编码器(AutoEncoder). https://zhuanlan.zhihu.com/p/80377698

[3]时光_机.自动编码器及其变种. https://blog.csdn.net/qq_19784349/article/details/79624017

[4]AiTechYun. 一文搞懂自编码器及其用途(含代码示例). http://www.sohu.com/a/224516673_99992181

[5] zlinxi.深度学习之卷积自编码器. https://blog.csdn.net/qq_33273962/article/details/83547342

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187164.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • datagrip 激活-激活码分享

    (datagrip 激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月29日
  • 网络python培训班「建议收藏」

    网络python培训班「建议收藏」为进一步推动高等院校人工智能教学工作的开展,加强国内各高等院校同行间的交流,培养国内的师资力量,将人工智能最新实训内容带入课堂,特举办“人工智能系列课程理论与实践”高级培训班。该培训定于2021年7月20日开始,共包含七大专题,每个专题5天左右,共计30天,通过线上直播的方式进行集训。七大专题分别为Python机器学习,图像识别与深度学习,深度学习与NLP,知识图谱、图神经网络和强化学习,深度学习PyTorch理论与实战。本次培训由权威专家主讲,提供实验环境及实验数据,并提供配套资料,通过剖析工程案例展

    2022年7月19日
  • opencv中imread第二个参数的含义「建议收藏」

    opencv中imread第二个参数的含义「建议收藏」文档中是这么写的:Flagsspecifyingthecolortypeofaloadedimage:CV_LOAD_IMAGE_ANYDEPTH-Ifset,return16-bit/32-bitimagewhentheinputhasthecorrespondingdepth,otherwiseconvertitto8-bit

    2022年10月10日
  • 基于情感词典进行情感态度分析[通俗易懂]

    基于情感词典进行情感态度分析[通俗易懂]情感分析是指挖掘文本表达的观点,识别主体对某客体的评价是褒还是贬,褒贬根据进态度行倾向性研究。文本情感分析可以分为基于机器学习的情感分类方法和基于语义理解的情感分析。基于机器学习进行语义分析的话需要大量的训练集,同时需要人工对其进行分类标注。我所使用的方法是基于语义理解中的使用情感词典进行情感态度分析。下面是我所使用的情感词典:链接:HTTPS://pan.baidu.com/s/1xC…

    2022年8月23日
  • 利用CSkin组件设计漂亮的WinForm登录界面「建议收藏」

    利用CSkin组件设计漂亮的WinForm登录界面「建议收藏」众所周知,WinForm具有快速开发的优点,但是美观方面一直被人诟病,一般美化都是采用第三方的组件来满足美化效果,这里我也利用Cskin组件来设计一个具有一定美感的登录界面,CSkin下载CSkin的使用你可以自行查看下载后的文档或者另行百度,这里就不介绍了,关于CSkin的美化登录界面简单介绍,主要是利用背景图片结合CSkin界面和控件的效果来实现的,如果你中别人的登录界面,你也可以截取别人的登录界面,然后用自己的控件覆盖人家的登录输入位置,覆盖别人的logo或者系统名称等,这也是一种技巧。

    2022年5月27日
  • 8000401a错误解决方案(Word应用程序无法访问)

    8000401a错误解决方案(Word应用程序无法访问)前一阵子做开发需要用到Excel和Word编程,本人用的是Vista系统,开发环境是VS2005和Office2007,测试无任何问题,可是到部署的时候出现了一些令人很头痛的问题,老是会出现例如:检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误:8000401a。的错误,在网上查询了许多资

    2022年7月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号