SDAE(stacked denoised autoencoder ,堆栈去噪自编码器)是vincent大神提出的无监督的神经网络模型,论文:Stacked Denoising Autoencoders: Learning Useful Representations ina Deep Network with a Local Denoising Criterion,原文作者从不同角度解释了模型架构设计理念,非常值得一读。原文请戳:http://www.jmlr.org/papers/volume11/vincent10a/vincent10a.pdf

先介绍SDAE的主要流程,如下图。x是输入的信号,对x增加了一些噪声后得到x',下图中加噪声的方法是舍弃了几个神经元,即神经元随机置0,然后进行矩阵变换 [图中f] 得到y,对y再进行矩阵变换 [图中g] 得到z,损失函数就是原始信号x和z之间的距离,我们希望这个距离越小越好,可以用二范数度量或者其他。

为什么说SDAE是无监督任务?

有监督方法需要有输入信号对应的标签,比如图像分类任务有整幅图对应的标签,语义分割任务有图中每个像素对应的标签,比如最经典的数字分类网络lenet5,需要知道每幅图对应的数字是几。无监督任务是不需要标签的, 从fig1我们可以看到,输入信号只有x,我们已知的信息只有x,加入x是二维图像的话,没有这幅图的任何标签信息。所以说SDAE是无监督的。

本文SDAE针对图像进行训练,模型的输入是图像每个像素位置5*5的邻域块共25个元素。

    SDAE网络训练的总流程如图1所示,后面逐一对三个步骤进行详细介绍

图1: SDAE网络训练总流程图

一、数据预处理

1,函数:uniform_sampling.m

patchsize =5; % window size;

[patches_1,patches_2]= uniform_sampling(im1,im2,patchsize);

上面函数中patchsize是采样窗大小,可自行设置这里设置为5;输入的im1和im2分别为时相1图像和时相2图像,假设输入的都是Bern图像,im1和im2大小分别是301*301,对每个像素采样选择以该像素为中心的5*5邻域像素值,则每个像素对应25维向量,则im1和im2变成了301*301*25的三维向量,再将前两维转变为1维,则im1和im2的大小都变成了90601*25. 令patches_1=im1,大小为90601*25,令patches_2=im2,大小为90601*25

数据预处理的流程如下:

Im1数据预处理如图2所示,Im2和im1处理方法相同。

图2 数据预处理

二、SDAE网络训练

pre-training

1,网络结构初始化

函数saesetup.m ;nnsetup.m;

SDAE输入的是patches_1和patches_2,是25维数据,中间隐层设置为100维,输出是20维,所以网络结构是25——>100——>20,pre-training的时候是每次只训练一层,每层都作为一个去噪自编码器训练,然后训练完了一层再训练下一层;回忆下自编码器的流程,希望输入X和输出Z是一致的,然后通过最小化输入和输出的误差L(X,Z)来求权重W,所以这里需初始化两个网络。

第一层的网络结构是25——>100——>25,初始化的权重分别记为sae.ae{1}W{1}:100*26 ,sae.ae{1}W{2}:25*101; 其中ae{1}是指第一层网络,W{1}是从25映射到100需要的权重,W{2}是从100映射到25需要的权重。

第二层的网络结构是100——>20——>100,初始化的权重分别记为sae.ae{2}W{1}:20*101,sae.ae{2}W{1}:100*21; 其中ae{2}是指第一层网络,W{1}是从100映射到20需要的权重, W{2}是从20映射到100需要的权重.

除了权重W,还有权重变化量vW需要初始化,vW用来梯度下降法时更新W,还有其他一些参数需要初始化activation_function,learningRate等,等下面用到再做具体介绍。

2,训练网络参数

函数:saetrain.m ;nntrain.m

1, 循环for i = 1 :numel(sae.ae):

这里循环两次,第一次训练第一层的网络参数;第二次训练第二层的网络参数.

2, 每次循环进入nntrain函数

train_x=train_y,train_x是patches_1和patches_2按行连接后的图像,大小是181200*25。

for i = 1 :numepochs循环的次数是自己设置的,这里numepochs =3,在main函数中设置,意思是每层网络均训练三次。

for i = 1 : numbatches,(numbatches=1812),batch_x是从train_x中随机取100行,batch_x大小则是100*25,(这里循环1812次是因为每次训练都是任取100行数据,所以需要循环1812次,才能将所有输入训练完,这样做的原因是:比一次全部输入181200行元素能够大大降低权重W的参数数量,降低内存消耗,加快执行时间。)对batch_x添加噪声(标志位是nn.inputZeroMaskedFraction ~= 0)这里batch_x添加的噪声方法是随机的将一部分元素置0,其余不变;batch_y是未加噪的batch_x。

每次训练同时训练100个像素训练的流程是:nnff——>nnbp——>nnapplygrads,训练完成后得到新权重W,然后再用新权重W训练下100个像素,直到所有像素训练完得到最终的权重W。

nntrain函数流程如下:

图3 nntrain函数流程

图3中的流程进行一遍,完成一次网络的训练。训练第一层网络需要循环三次图3流程,训练第二层网络和fine-tuning均需要循环三次图3流程。

训练第一层网络:

2.1 nnff函数:执行网络前馈

nnff(nn, x, y),nn是网络结构,x是batch_x(100*25,加了噪声),y是batch_y(100*25,未加噪声的原始输入)。

nnff是网络前馈,(第一次使用的权重W是网络结构初始化的权重W,后面使用的权重W是前一次网络训练得到的权重W).

图4 第一层网络前馈

第一层网络训练的前馈如图5所示,对batch_x加一列全为1的bias记为nn.a{1},nn.a{1}乘以权重nn.W{1},再取sigmoid函数,加一列全1的bias记为nn.a{2}; nn.a{2}乘以权重nn.W{2},再取sigmoid函数,加一列全1的bias记为nn.a{3},即输出Z.

nn.e =batch_y- Z; nn.e是误差,误差是原始未加噪输入batch_y和训练后的输出Z的差,

误差函数:

目标函数是min 来更新权重,最优化方法是使用BP算法和梯度下降法来得到目标函数的最优解。

2.2 nnbp函数:使用BP算法反求权重变化量dW

中间变量d:

d{3} = - nn.e.* (nn.a{3} .* (1 - nn.a{3}));

d{2} = d{3} *nn.W{2} .* nn.a{2} .* (1 - nn.a{2})

根据中间变量d来更新权值变化量dW的公式:

nn.dW{1} = (d{2}(:,2:end)'* nn.a{1}) / size(d{2}, 1);

nn.dW{2} = (d{3}'* nn.a{2}) / size(d{3}, 1);

2.3  nnapplygrads函数:通过梯度下降法来更新权重W

dW = nn.learningRate * dW{i}; 其中learningRate学习率自己设置1

nn.vW{i} =nn.momentum*nn.vW{i} + dW; 其中momentum自己设置为0.5,nn.vW初始化全0,结构和nn.W一样

dW = nn.vW{i};

nn.W{i} =nn.W{i} - dW;

其中i取值为1和2,先更新W{1}在更新W{2}

到这里网络完成一次训练。

 

 

训练第二层网络:

2.1 nnff函数

图5 第二层网络前馈

图4中的sae.ae{1}W{1}是第一层网络训练好后得到的权重,train_x乘以权重sae.ae{1}W{1},得到第二层网络的原始输入,随机取100行得到batch_y,加噪声得到batch_x,对batch_x加一列全为1的bias记为nn.a{1},nn.a{1}乘以权重nn.W{1},再取sigmoid函数,加一列全1的bias记为nn.a{2}; nn.a{2}乘以权重nn.W{2},再取sigmoid函数,加一列全1的bias记为nn.a{3},即输出Z.

nn.e =batch_y- Z; nn.e是误差,误差是原始未加噪输入batch_y和训练后的输出Z的差,

误差函数:

2.2 nnbp函数

步骤同上

2.3 nnapplygrads函数

步骤同上

到这里网络完成一次训练。

3,saetrain.m函数执行完成后,完成pre-training的训练,新的权重W分别记为sae.ae{1}W{1},sae.ae{1}W{2},sae.ae{2}W{1} ,sae.ae{2}W{2},

Fine-tuning

1,网络结构初始化

函数saesetup.m ;nnsetup.m;

Fine-tuning阶段是针对整个网络进行的微调,整个网络的结构为:

25——>100——>20——>100——>25,初始权重采用pre-training训练好的四个权重,25——>100的映射选择权重sae.ae{1}W{1},100——>20的映射选择权重sae.ae{2}W{1},20——>100的映射选择权重sae.ae{2}W{2},100——>25的映射选择权重sae.ae{1}W{2}。

2,训练网络参数

函数:saetrain.m ;nntrain.m

具体流程使用的函数和pre-training相同。

2.1 nnff函数

图6 Fine-tuning前馈

前馈网络如图5所示,train_x是patches_1和patches_2按行连接后的图像,大小是181200*25,然后任取100行记为batch_y,对batch_y加噪声记为batch_x(加噪声的方式是将部分元素置0),对batch_x加一列全为1的bias记为nn.a{1},nn.a{1}乘以权重nn.W{1}(nn.W{1}等于前面训练好的sae.ae{1}W{1}),再取sigmoid函数,加一列全1的bias记为nn.a{2};nn.a{2}乘以权重nn.W{2}(nn.W{2}等于前面训练好的sae.ae{2}W{1}),再取sigmoid函数,加一列全1的bias记为nn.a{3}; nn.a{3}乘以权重nn.W{3}(nn.W{3}等于前面训练好的sae.ae{2}W{2}),再取sigmoid函数,加一列全1的bias记为nn.a{4}; nn.a{4}乘以权重nn.W{4}(nn.W{4}等于前面训练好的sae.ae{1}W{2}),再取sigmoid函数记为nn.a{5}; 网络的最后输出Z就是nn.a{5}。

误差函数:

通过min 来得到新的权重。

2.2 nnbp函数

步骤同上

2.3 nnapplygrads函数

步骤同上

到这里网络完成一次训练。

3,saetrain.m函数执行完成后,完成fine-tuning的训练,新的权重W分别记为sae.ae{1}W{1},sae.ae{1}W{2},sae.ae{2}W{1} ,sae.ae{2}W{2},

三、SDAE提取特征

经过上面的pre-training和fine-tuning后,网络就训练好了,然后重新将train_x输入网络,就得到了20维特征。最终的Z就是输出的10维特征。

图7 SDAE提取特征

SDAE训练流程和代码实现(Matlab)——咬文嚼字系列相关推荐

  1. 煤炭价格预测:基于matlab的时间序列分析(主要流程+完整代码)

    基于matlab的时间序列分析(主要流程+完整代码) 案例简介 时间序列简介 平稳时间序列{xt} ARIMA=AR+MA+INTEGRATER 实例应用 数据平稳化 模型选择--确定p.q ACF/ ...

  2. MATLAB仿真作图的流程与代码结构-经验总结

    文章目录 流程简述 代码结构 1.第一部分:加载数据 2.第二部分:仿真计算 3.第三部分:绘图 命名规则 流程简述 在长期编写matlab代码中总结出得经验:通过一个合理的流程来写MATLAB代码, ...

  3. 低成本复制 ChatGPT 训练流程,仅需 1.68GB GPU 即可使用,方法现已开源!

    编译 | 屠敏 出品 | CSDN(ID:CSDNnews) 当昨日我们还在讨论从大厂以及个人创业的角度来看,复制一家 OpenAI 和一款强大的 ChatGPT 可行性究竟有几成之际,苦于 Open ...

  4. 机器学习小组知识点45:批量梯度下降法(BGD)和随机梯度下降法(SGD)的代码实现Matlab版1

    原 机器学习小组知识点4&5:批量梯度下降法(BGD)和随机梯度下降法(SGD)的代码实现Matlab版 2016年10月19日 10:17:28 Eric2016_Lv 阅读数:3379 这 ...

  5. YOLOv5环境搭建、训练流程及tensorrt转换生成plan文件

    一.背景 github官网yolov5,代码什么的从这个网站下 二.环境搭建 有两种环境搭建方式,一是用conda搭个虚拟环境,然后安装所有需要的库跟依赖等:二是用docker容器,下载英伟达的pyt ...

  6. XGB建模流程化代码—仅作学习笔记

    XGB建模流程化代码-仅作个人学习笔记 以下绝大部分出自网络,因为不知道具体作者是谁...代码部分针对自己学习使用修改了一下 建模的要点80%在数据,我是真的理解到了,心痛.头疼☠ 本篇主要是把xgb ...

  7. 【Go API 开发实战 3】API 流程和代码结构

    API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...

  8. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  9. php做一个微信退款,PHP实现微信申请退款流程实例代码

    前面讲了怎么实现微信支付,详见博文:php实现微信支付(jsapi支付)流程  和ThinkPHP中实现微信支付(jsapi支付)流程.由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了. ...

最新文章

  1. 阿里取消“361”绩效考核,是打工人的福报吗?
  2. 截屏悬浮软件_【第295期】FV悬浮球,一款全能悬浮球
  3. 精通python能干什么-转行做数据分析,是否需要精通python?
  4. Hyperledger Fabric 词汇表
  5. php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程
  6. Lambda运行时内部:窥视无服务器巢穴
  7. ajax的url怎么将后缀补上_蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法
  8. 发送请求_发送soap请求调用WSDL
  9. 计算机 编程 教程 pdf,计算机专业教程-第3章编程接口介绍.pdf
  10. 微型计算机中存储器分成哪几个等级?它们各有什么特点?用途如何?,《微机原理》复习思考题第十二章存储器.DOC...
  11. java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码
  12. django-获取用户数据小结-编辑中
  13. 百度AI 17篇 CVPR 2019 论文介绍(附下载)
  14. 在Hadoop集群实施成功后再次格式化名称节点,datanode无法加入集群的处理办法
  15. c9500堆叠配置_用C ++堆叠
  16. 关于重分类工具的其他讨论
  17. 一段有趣的python小代码(将numpy中的数组转化为可哈希的字典)
  18. 把生活过的像模像样已经很不容易
  19. 一些比较好用的网站整站下载工具
  20. 数据库原理与应用学习笔记(一)

热门文章

  1. Linux技术学习路线
  2. Android Java汉字转拼音总结
  3. 计算机用纸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. TPC116S8使用介绍(含可用驱动程序)
  5. 短视频php源码,短视频平台开发,上传短视频
  6. 猎豹浏览器修改背景色
  7. 元宇宙步入“冷静期”,何时才能跨过虚拟与现实的“裂谷”?
  8. Java 注解操作大全。2019最牛操作!!!
  9. 使用ChatGPT为Stable Diffusion生成画面的关键词
  10. java多态实现动物叫唤_Java多态实现