SDAE训练流程和代码实现(Matlab)——咬文嚼字系列
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)——咬文嚼字系列相关推荐
- 煤炭价格预测:基于matlab的时间序列分析(主要流程+完整代码)
基于matlab的时间序列分析(主要流程+完整代码) 案例简介 时间序列简介 平稳时间序列{xt} ARIMA=AR+MA+INTEGRATER 实例应用 数据平稳化 模型选择--确定p.q ACF/ ...
- MATLAB仿真作图的流程与代码结构-经验总结
文章目录 流程简述 代码结构 1.第一部分:加载数据 2.第二部分:仿真计算 3.第三部分:绘图 命名规则 流程简述 在长期编写matlab代码中总结出得经验:通过一个合理的流程来写MATLAB代码, ...
- 低成本复制 ChatGPT 训练流程,仅需 1.68GB GPU 即可使用,方法现已开源!
编译 | 屠敏 出品 | CSDN(ID:CSDNnews) 当昨日我们还在讨论从大厂以及个人创业的角度来看,复制一家 OpenAI 和一款强大的 ChatGPT 可行性究竟有几成之际,苦于 Open ...
- 机器学习小组知识点45:批量梯度下降法(BGD)和随机梯度下降法(SGD)的代码实现Matlab版1
原 机器学习小组知识点4&5:批量梯度下降法(BGD)和随机梯度下降法(SGD)的代码实现Matlab版 2016年10月19日 10:17:28 Eric2016_Lv 阅读数:3379 这 ...
- YOLOv5环境搭建、训练流程及tensorrt转换生成plan文件
一.背景 github官网yolov5,代码什么的从这个网站下 二.环境搭建 有两种环境搭建方式,一是用conda搭个虚拟环境,然后安装所有需要的库跟依赖等:二是用docker容器,下载英伟达的pyt ...
- XGB建模流程化代码—仅作学习笔记
XGB建模流程化代码-仅作个人学习笔记 以下绝大部分出自网络,因为不知道具体作者是谁...代码部分针对自己学习使用修改了一下 建模的要点80%在数据,我是真的理解到了,心痛.头疼☠ 本篇主要是把xgb ...
- 【Go API 开发实战 3】API 流程和代码结构
API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...
- 多类线性分类器算法原理及代码实现 MATLAB
多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...
- php做一个微信退款,PHP实现微信申请退款流程实例代码
前面讲了怎么实现微信支付,详见博文:php实现微信支付(jsapi支付)流程 和ThinkPHP中实现微信支付(jsapi支付)流程.由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了. ...
最新文章
- 阿里取消“361”绩效考核,是打工人的福报吗?
- 截屏悬浮软件_【第295期】FV悬浮球,一款全能悬浮球
- 精通python能干什么-转行做数据分析,是否需要精通python?
- Hyperledger Fabric 词汇表
- php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程
- Lambda运行时内部:窥视无服务器巢穴
- ajax的url怎么将后缀补上_蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法
- 发送请求_发送soap请求调用WSDL
- 计算机 编程 教程 pdf,计算机专业教程-第3章编程接口介绍.pdf
- 微型计算机中存储器分成哪几个等级?它们各有什么特点?用途如何?,《微机原理》复习思考题第十二章存储器.DOC...
- java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码
- django-获取用户数据小结-编辑中
- 百度AI 17篇 CVPR 2019 论文介绍(附下载)
- 在Hadoop集群实施成功后再次格式化名称节点,datanode无法加入集群的处理办法
- c9500堆叠配置_用C ++堆叠
- 关于重分类工具的其他讨论
- 一段有趣的python小代码(将numpy中的数组转化为可哈希的字典)
- 把生活过的像模像样已经很不容易
- 一些比较好用的网站整站下载工具
- 数据库原理与应用学习笔记(一)