【自编码器】梳理(上)

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

梳理有关自编码器

1. 自编码器

1.1 原理

Auto-Encoder,中文称作自编码器,是一种无监督式学习模型。利用输入数据 X X X本身作为监督,来指导神经网络尝试学习一个映射关系,从而得到一个重构输出 X R X^R XR

可以用于异常检测场景,异常对于正常来说是少数,所以我们认为,如果使用自编码器重构出来的输出 X R X^R XR 跟原始输入的差异超出一定阈值(threshold)的话,原始时间序列即存在了异常。和之前介绍的padim、patchcore等思想类似。

算法主要分为:encoder和decoder。

  • 编码器的用于将高维输入 X X X编码成低维的隐 变量 h h h,从而强迫网络学习有用信息特征
  • 解码器用于把隐变量 h h h还原到初始维度,最好的状态是解码器的输出能够近似恢复原始输入。

如果输入神经元个数n大于隐藏层个数m,那么就相当于把数据从n维降到m维,类似PCA。

img

1.2 作用

  • 特征学习:通过学习数据的有用表示,自动编码器可以用于特征学习任务,有助于提高监督学习模型的性能
  • 降维:自动编码器可以将高维数据映射到低维空间,从而实现数据的降维,有助于可视化和减少计算复杂度
  • 图像去噪:通过训练自动编码器来学习对输入数据的干净表示,可以用于去除图像中的噪声
  • 生成模型:通过改变自动编码器的架构,可以设计生成对抗网络(GAN)等生成模型

1.3 demo

def getModel():
    input_layer = Input(shape=(x.shape[1],))
    encoded = Dense(8, activation='relu', activity_regularizer=regularizers.l2(10e-5))(input_layer)  # l2正则化约束
    decoded = Dense(x.shape[1], activation='relu')(encoded)
    autoencoder = Model(input_layer, decoded)
    autoencoder.compile(optimizer='adam', loss='mean_squared_error')
    return autoencoder 

2. 降噪自编码器

论文: Extracting and Composing Robust Features with Denoising Autoencoders

原理: 原始数据X上加入了噪声X’,然后再作为网络的输入数据,来重构输出原始还未加入噪声的数据。

因此降噪自编码的损失函数是构造原始数据X与网络输出X’'之间的一个差异性度量。加入噪声,然后训练恢复原始数据,可以让我们的网络具有更强的抗噪能力,使得自编码更加鲁邦。

通过对原始数据输入神经元,进行人为随机损坏加噪声,得到损坏数据X’。主要有:

  • 采用高斯噪声
  • 把输入神经元随机置0(类似dropout)

img

3. 稀疏自编码器

损失函数加入一个KL散度作为网络的正则约束项

img

4. 收缩自编码器

同样是修改损失函数,

img

5. 栈式自编码器

开始讲什么是栈式自编码前,让我们先来了解一些深度学习中的无监督预训练。我们知道,在深度学习中,一般网络都有很多层,因为网络层数一多,训练网络采用的梯度下降,在低层网络会出现梯度弥散的现象,导致了深度网络一直不招人待见。直到2006年的3篇论文改变了这种状况,由Hinton提出了一种深层网络的训练方法,改变了人们对深度学习的态度。Hinton所提出的训练思想,整体过程如下;

A、网络各层参数预训练。我们在以前的神经网络中,参数的初始化都是用随机初始化方法,然而这种方法,对于深层网络,在低层中,参数很难被训练,于是Hinton提出了参数预训练,这个主要就是采用RBM、以及我们本篇博文要讲的自编码,对网络的每一层进行参数初始化也就是我们这边要学的稀疏自编码就是为了对网络的每一层进行参数初始化,仅仅是为了获得初始的参数值而已(这就是所谓的无监督参数初始化,或者称之为“无监督 pre-training”)。

B、比如采用自编码,我们可以把网络从第一层开始自编码训练,在每一层学习到的隐藏特征表示后作为下一层的输入,然后下一层再进行自编码训练,对每层网络的进行逐层无监督训练。

C、当我们无监督训练完毕后,我们要用于某些指定的任务,比如分类,这个时候我们可以用有标签的数据对整个网络的参数继续进行梯度下降调整。

这就是深层网络的训练思想,总体归结为:无监督预训练、有监督微调。

OK,我们回到本篇文章的主题,从上面的解释中,我们知道稀疏自编码仅仅只是为了获得参数的初始值而已。栈式自编码神经网络是一个由多层稀疏自编码器组成的神经网络,其前一层自编码器的输出作为其后一层自编码器的输入。栈式自编码就是利用上面所说的:无监督pre-training、有监督微调进行训练训练的深度网络模型。接着就让我们来学一学具体的栈式自编码网络训练。

训练如下网络如下分类任务:

img

step1: 无监督pre-training阶段:

先采用自编码的方式,训练第一个隐藏层:

img

训练完以后,继续训练第二个隐藏层:

把h1作为输入,把h2作为隐藏层,然后进行自编码训练

img

至此,我们对两个中间层的参数进行的训练初始化。

后面就是正常的网络训练了。

参考

  1. https://blog.csdn.net/hjimce/article/details/49106869
  2. http://sofasofa.io/tutorials/anomaly_detection/
  3. https://blog.csdn.net/lijj0304/article/details/136269138
  4. https://blog.csdn.net/liangjiubujiu/article/details/81286770
  5. https://zhuanlan.zhihu.com/p/80377698
  6. https://zhuanlan.zhihu.com/p/133207206
  7. https://zhuanlan.zhihu.com/p/68903857
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 有很多工具可以快速梳理程序代码,具体可以根据您使用的编程语言和编辑器以及您的需求来选择。常见的工具包括: 1. 代码格式化工具,如 `clang-format`,可以将代码自动格式化为指定的风格。 2. 代码重构工具,如 `Refactor! Pro`,可以自动重构代码,比如自动提取出函数、重命名变量等。 3. 代码规范检查工具,如 `ESLint` 和 `Pylint`,可以帮助您找出代码中的不规范之处,并提出建议修改。 4. 代码浏览工具,如 `CTags` 和 `Cscope`,可以帮助您快速浏览代码中的函数、变量和类定义等。 5. 代码图形化工具,如 `Doxygen` 和 `Graphviz`,可以将代码生成 UML 图或其他图形,从而帮助您更好地理解代码结构。 ### 回答2: 在软件开发过程中,有一些工具可以帮助程序员快速梳理程序代码。以下是一些常用的工具: 1. IDE(集成开发环境):常见的IDE如Eclipse、IntelliJ IDEA等提供了各种功能,包括代码编辑、编译、调试等。IDE通常会自动格式化代码,并提供代码补齐和重构工具,帮助程序员快速修改和梳理代码。 2. 代码静态分析工具:例如FindBugs、Checkstyle等。这些工具通过检查代码中的潜在错误、不合规范的编码风格以及代码质量问题等,帮助程序员梳理代码,并提供修复建议。 3. UML工具:Unified Modeling Language(统一建模语言)工具如Enterprise Architect、Visual Paradigm等可以将代码转换为UML图,帮助程序员理清代码结构和逻辑关系,快速梳理和分析程序。 4. 代码审查工具:例如SonarQube、Crucible等。这些工具可以对代码进行全面、系统的审查,帮助程序员发现潜在的问题和改进代码质量。 5. 版本控制工具:例如Git、SVN等。版本控制工具可以记录和管理代码的修改历史,帮助程序员追踪代码的演变和变更,方便梳理代码以及回退修改。 6. 搜索和替换工具:例如grep、sed等。这些工具可以通过正则表达式或其他搜索条件来快速搜索和替换代码中的特定模式,帮助程序员快速修改和梳理代码。 通过使用这些工具,程序员可以更高效地梳理程序代码,提高代码质量和开发效率。 ### 回答3: 在程序开发的过程中,有一些工具能够帮助程序员快速梳理程序代码,提高开发效率和代码质量。以下是几个常用的工具: 1. 编辑器与集成开发环境(IDE):像Visual Studio Code、Atom、Sublime Text和Eclipse等编辑器和IDE都提供了代码编辑、代码提示、代码格式化、代码折叠等功能,方便程序员对代码进行梳理和重构。 2. 代码版本控制工具:如Git和SVN等,它们能够对代码进行版本管理,并提供分支管理、合并等功能,可以方便地对代码进行梳理、重构和修改。 3. 静态代码分析工具:例如Pylint、Checkstyle和SonarLint等工具,能够对代码进行静态分析,检测代码中的潜在错误、代码规范性问题和性能问题等,帮助程序员梳理代码,提高代码质量。 4. 代码重构工具:例如Visual Studio、IntelliJ IDEA和Eclipse等IDE都提供了代码重构功能,可以通过自动重构或批量重构的方式对代码进行梳理和优化,例如提取方法、提取变量、重命名等。 5. 代码测试工具:例如JUnit和Selenium等测试框架,可以帮助程序员编写和运行单元测试、UI测试等,及时发现代码中的问题,帮助梳理代码,提高代码质量。 总之,以上提到的工具不仅能够帮助程序员快速梳理代码,还能提高代码质量、减少错误和提高开发效率。在实际开发中,根据具体需求选择适合自己的工具,可以更好地进行代码梳理和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡侃有料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值