DeepLearnToolbox代码详解——SAE,DAE模型

更新时间:2023-06-09 10:55:15 阅读: 评论:0

DeepLearnToolbox代码详解——SAE,DAE模型
⼀:引⾔.sae,dae,dropout模型简介
上⾯提到的三个模型都是在经典的多层神经⽹络的基础上加深构架得到;例如sae(Stack autoencoder)就是理堆叠多个autoencoder,然后使⽤fine_tuning过程;dae(Denoising autoencoder)是在标准的sae基础上给输⼊数据加⼊噪声,利⽤污染后的数据进⾏sae;dropout 则是随机忽略隐层节点来训练多个不同的模型,然后通过模型平均来预测。
下⾯就详细讲解⼀下这个sae框架的训练过程,以及调⽤函数的说明。
⼆:实例讲解
1.  试验准备:
2. ⽂件配置:
2.1 ⾸先打开新建的test_sae.m⽂件;
2.2 然后把current folder,窗⼝转到……matlabdlToolBox\DeepLearnToolbox-master
2.3 在command 窗⼝输⼊:addpath(genpath('.'));
2.4 打开test_sae.m,运⾏就ok了
2.5 等着出结果
3.⽹络结构说明
本⽂以minist⼿写数字识别为例,输⼊数据为784,即visible层为784个节点。
假设我们训练的⽹络结构为:784——200—— 100—— 10,也就是说有4层,⼀个输⼊层,2个中间隐层;1个输出隐层,来进⾏预测分类。
⽹络结构如图:
4.主函数代码:test_sae.m
clear all; clo all; clc;
%% //导⼊数据
load mnist_uint8;
train_x = double(train_x)/255;
test_x  = double(test_x)/255;
train_y = double(train_y);
test_y  = double(test_y);
%%⼀:采⽤autoencoder进⾏预训练
rng(0);%⾼版本的matlab可以使⽤这个语句,低版本会出错
sae = saetup([784 200 100]);
sae.ae{1}.activation_function      = 'sigm';
sae.ae{1}.learningRate            = 1;
sae.ae{1}.inputZeroMaskedFraction  = 0.;
sae.ae{2}.activation_function      = 'sigm';
sae.ae{2}.learningRate            = 1;
sae.ae{2}.inputZeroMaskedFraction  = 0.;
opts.numepochs =  1;
opts.batchsize = 100;
visualize(sae.ae{1}.W{1}(:,2:end)')
%⼆:fine_tuning过程
% U the SDAE to initialize a FFNN
极限值
nn = nntup([784 200 100 10]);
nn.activation_function            = 'sigm';
nn.learningRate                    = 1;
%add pretrained weights
nn.W{1} = sae.ae{1}.W{1};
nn.W{2} = sae.ae{2}.W{1};
% Train the FFNN
opts.numepochs =  1;
opts.batchsize = 100;
nn = nntrain(nn, train_x, train_y, opts);
[er, bad] = nntest(nn, test_x, test_y);思想决定行为
str = sprintf('testing error rate is: %f',er);
disp(str)
三:pre_training阶段代码详解
3.1:⽹络结构建⽴
Sae⽹络就是堆叠多个autoencoder⽹络,所以此⽹络结构由2个autoencoder构成,分别是:v—h1—v和h1—h2—h1.此处主要利⽤saetup函数来实现,
3.1.1  Saetup函数说明
输⼊参数:size为构建⽹络的节点向量,由于此处pre_training阶段的⽹络为784-200-100;所以size=[784  200  100]
输出参数:sae元包矩阵,每⼀个元包矩阵对应⼀个autoencoder⽹络;例如sae.ae{1}中“存放”的就是v——h1——v这个autoencoder;
函数体说明:通过for循环2次,调⽤nntup函数两次,⽣成两个autoencoder
function sae =saetup(size)
for u = 2 :numel(size)
sae.ae{u-1}= nntup([size(u-1) size(u) size(u-1)]);
end
end
autoencoder构建:我们知道autoencoder就是⼀个v——h——v 的3层神经⽹络;所以主要通过nntup来构建。
3.1.2 nntup函数说明
输⼊参数:nntup(architecture),architecture,顾名思义,就是构建⽹络的结构,也就是每层⽹络的神经元节点个数,例如本题为第⼀个autoencoder结构为v—h1—v  [784 200 784]
输出参数nn:⼀个元包矩阵,元包矩阵中存放着⼀个autoencoder⽹络的各种配置参数
函数体说明:
Encoder过程:y=f(xw'+b)
激活函数nn.activation_function:f(),⼀般有sigmoid和tanh两种;
学习率  nn.learningRate:控制学习的速度,
动量项 nn.momentum:调节在应⽤minibatch⽅法训练⽹络时,每次新权值更新值和上⼀次权值更⾏值的相对⽐例;
权值惩罚项 nn.weightPenaltyL2:防⽌权值过⼤,发⽣过拟合现象;
稀疏⽬标 nn.sparsityTarget:通过控制隐层激活值的平均值,来控制隐层激活值的稀疏性
Decoder过程:x=g(wy+b)
解码激活函数设置:sigmoid和tanh两种
其他参数:例如dae中的加噪⽐例参数,dropout中的隐层节点的忽略⽐例等
权值W初始化:
W结构初始化:权值矩阵W的⾏列数,例如若使⽤:h=f(x*w'+b),本例中第⼀个autoencoder中,权值矩阵w1为200*785  ,
(785=784+1,1为偏置项b,后⾯介绍)
W元素初始化:W的元素初始值为⼀个0均值的随机矩阵,权值系数很⼩,这样可以防⽌过拟合
nn.W{i - 1} = (a*b);
a=rand(nn.size(i), nn.size(i - 1)+1) - 0.5)%⽣产⼀个0均值,范围元素值在[-0.5 0.5]范围内的矩阵
b=2 * 4 * sqrt(6 / (nn.size(i) + nn.size(i - 1))%缩减矩阵元素值到⼀个更⼩的范围
3.2:⽹络训练阶段
此阶段主要调⽤saetrain函数来训练⽹络;
3.2.1  Seatrain函数说明
输⼊参数:saetrain(sae, x, opts)
Sae为step1阶段设置好的⽹络结构;x为输⼊数据;opts中有两个参数;其中opts.numepochs为训练次数,所有样本⼀共训练多少次;opts.batchsize参数,为在对所有样本进⾏minibatch训练时,每个batch的容量,即每个batch的样本个数。车把式
输出参数:训练好的元包矩阵sae
函数体说明:通过for循环,调⽤nntrain函数,依次训练每个autoencoder。
3.2.2  Nntrain函数说明:
输⼊参数:nntrain(nn, train_x, train_y, opts, val_x, val_y)
其中nn为⼀个元包矩阵,nn中存放的是⽹络的配置参数;train_x,train_y就是输⼊数据,和⽬标数据;在autoencoder⽹络中,都是输⼊数据x,opts参数,已经说过;⾄于val_x和val_y做什么的不清楚,训练中暂时⽤不到。
输出参数:[nn, L],已经训练好的⽹络参数,主要训练W和b,L为损失函数值,在autoencoder中是重构误差。
函数体说明:
书名号的作用
1.minibatch部分
所谓的minibatch训练⽅法就是把所有训练样本分成多个batch,然后依次训练每个batch中的样本。
将训练集事先分成包含⼏⼗或⼏百个样本的⼩批量数据进⾏计算将更⾼效,这主要是可以利⽤图形处理器Gpu和matlab中矩阵之间相乘运算的优势。
m = size(train_x, 1);%提取样本总数
batchsize = opts.batchsize; %每个batch中样本个数
numepochs = opts.numepochs; %所有样本训练次数
numbatches = m / batchsize; %所有样本分成多少个batch
2.训练过程
for i = 1 : numepochs%所有样本训练次数
kk =randperm(m); %形成样本编号的随机向量
for l = 1 : numbatches%每次提取batchsize个样本,⼀共提取numbatches次
batch_x =train_x(kk((l - 1) * batchsize + 1 : l * batchsize), :);
batch_y =train_y(kk((l - 1) * batchsize + 1 : l * batchsize), :);
nn =nnff(nn, batch_x, batch_y); %前馈计算⽹络
被紫外线灯照到有什么后果呀
nn =nnbp(nn);%计算误差和权值梯度
nn =nnapplygrads(nn);%参数更新
L(n) =nn.L;
n = n + 1;菠萝蜜怎么挑
end
end
在nntrain末尾还可以缩减学习率,使更新步长逐渐变⼩。
nn.learningRate = nn.learningRate *nn.scaling_learningRate;
3.2.3 前馈函数nnff说明
输⼊参数:nnff(nn, batch_x, batch_y),这个就不说了,和上⾯⼀样
输出参数:元包矩阵nn,主要计算了隐层的激活函数值。
函数体说明:
1 添加偏置项
指猴
x = [ones(m,1) x];
nn.a{1} = x;
⼀般前馈计算过程为,h=f(xw’+b);其中参数b即为偏置项;此时在计算过程中,需要“复制”b维数,是的复制后的b可以和wx乘积结果可以相加(详见 );这样每次复制b,会增⼤计算量;本代码中,把偏置项,直接添加到输⼊数据x中,在x前添加⼀列0元素,作为偏置项b;这是样输⼊数据矩阵,就变成了60000*785,这也就和前⾯为什么要把权值矩阵w1定义为为200*785,⽽不是200*784了。
所以最后权值矩阵W1为200*785;W2为100*201 ;W3为10*101。
这样前馈计算过程,由h=f(xw’+b),变成了h=f(x*w’)
2 encoder和decoder过程
Encoder阶段:
for i = 2 : n-1
switch nn.activation_function
ca'sigm'
% Calculate the unit's outputs (including the bias term)
nn.a{i} = sigm(nn.a{i - 1} * nn.W{i - 1}');
ca'tanh_opt'
nn.a{i} = tanh_opt(nn.a{i - 1} * nn.W{i - 1}');
end
nn.a{i} =[ones(m,1) nn.a{i}];%给下⼀个⽹络的输⼊添加偏置项
end
decoder阶段:
根据选择的decoder函数,来计算;由于此处是autoencoder,通过 nn.a{n} = sigm(nn.a{n - 1} * nn.W{n - 1}');来⽣成输⼊数据的近似估计,以便⽤来求重构误差。
switch nn.output
ca'sigm'
nn.a{n}= sigm(nn.a{n - 1} * nn.W{n - 1}');
ca'linear'
nn.a{n}= nn.a{n - 1} * nn.W{n - 1}';
ca'softmax'买汤圆
nn.a{n}= nn.a{n - 1} * nn.W{n - 1}';
nn.a{n}= exp(bsxfun(@minus, nn.a{n}, max(nn.a{n},[],2)));
nn.a{n}= bsxfun(@rdivide, nn.a{n}, sum(nn.a{n}, 2));
end
3.计算损失函数
nn.e = y -nn.a{n};
switch nn.output
ca {'sigm', 'linear'}

本文发布于:2023-06-09 10:55:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/910617.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:矩阵   训练   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图