0步:初始化一些参数和常数

 

1步:利用训练样本集训练第一个稀疏编码器

 

2步:利用训练样本集训练第二个稀疏编码器

 

3步:利用第二个稀疏编码器提取到的特征训练softmax回归模型

 

4步:利用误差反向传播进行微调

 

5步:利用测试样本集对得到的分类器进行精度测试

下面将程序实现过程中的关键代码post出,欢迎各位网友指点!

stackedAEExercise.m

clc
clear
close all addpath ../common/
addpath ../common/minFunc %%======================================================================
%% STEP : 设置多层自编码器的相关参数
% 整个网络的输入输出结构
inputSize = * ;
numClasses = ;
% 稀疏自编码器结构
hiddenSizeL1 = ; % Layer Hidden Size
hiddenSizeL2 = ; % Layer Hidden Size
% 一些权值
sparsityParam = 0.1; % desired average activation of the hidden units.that is ρ in the lecture
beta = ; % weight of sparsity penalty term
lambda = 3e-; % weight decay parameter %%======================================================================
%% STEP : 载入MNSIT数据集及标签集
addpath mnist\
trainData = loadMNISTImages('mnist/train-images-idx3-ubyte');
trainLabels = loadMNISTLabels('mnist/train-labels-idx1-ubyte');
trainLabels(trainLabels == ) = ; % Remap to since our labels need to start from %%======================================================================
%% STEP : 训练第一个稀疏自编码器(训练样本集为trainData,看作是无标签训练样本集) % Randomly initialize the parameters
sae1Theta = initializeParameters(hiddenSizeL1, inputSize); % 利用无标签样本集对稀疏自编码器进行学习,学习到的参数存放在向量sae1OptTheta中
% 优化函数的一些参数设置
options.Method = 'lbfgs';
options.maxIter = ; % Maximum number of iterations of L-BFGS to run
options.display = 'on';
% 调用优化函数,得到优化向量sae1OptTheta [sae1OptTheta, ~] = minFunc( @(p) sparseAutoencoderCost(p, ...
inputSize, hiddenSizeL1, ... %输入维数、输出维数
lambda, sparsityParam, ...
beta, trainData), ...
sae1Theta, options);
%save('sae1OptTheta.mat','sae1OptTheta')
% % 权值可视化(Visualize weights)
% W11 = reshape(sae1OptTheta(:hiddenSizeL1 * inputSize), hiddenSizeL1, inputSize);
% display_network(W11');
% load('sae1OptTheta.mat'); %%======================================================================
%% STEP : 训练第二个稀疏自编码器(训练数据是第一个自编码器提取到的特征) % 求解第一个自编码器的输出sae1Features(维数为hiddenSizeL1)
[sae1Features] = feedForwardAutoencoder(sae1OptTheta, hiddenSizeL1, ...
inputSize, trainData); % Randomly initialize the parameters
sae2Theta = initializeParameters(hiddenSizeL2, hiddenSizeL1); % 开始训练第二个自编码器,输入维数是hiddenSizeL1,输出维数是hiddenSizeL2,优化向量存放在sae2OptTheta中
[sae2OptTheta, ~] = minFunc( @(p) sparseAutoencoderCost(p, ...
hiddenSizeL1, hiddenSizeL2, ... %输入维数、输出维数
lambda, sparsityParam, ...
beta, sae1Features), ...
sae2Theta, options);
% save('sae2OptTheta.mat','sae2OptTheta')
% % Visualize weights
% % W21 = reshape(sae2OptTheta(:hiddenSizeL2 * hiddenSizeL1), hiddenSizeL2, hiddenSizeL1);
% % display_network(W21'); %无法可视化!!
% load('sae2OptTheta.mat');
%%======================================================================
%% STEP : 训练softmax classifier(它的输入为第二个自编码器提取到的特征sae2Features) % 求解第二个自编码器的输出sae1Features(维数为hiddenSizeL2)
[sae2Features] = feedForwardAutoencoder(sae2OptTheta, hiddenSizeL2, ...
hiddenSizeL1, sae1Features); % Randomly initialize the parameters
saeSoftmaxTheta = 0.005 * randn(hiddenSizeL2 * numClasses, ); % 开始优化softmax classifier,得到优化向量
options.maxIter = ;
softmaxModel = softmaxTrain(size(sae2Features,), numClasses, lambda, ...
sae2Features, trainLabels, options);
saeSoftmaxOptTheta=softmaxModel.optTheta(:);
% load('saeSoftmaxOptTheta.mat') %%======================================================================
%% STEP : 微调多层自编码器 % 利用稀疏自编码(stack)和softmax分类器(saeSoftmaxOptTheta)学习到的参数作为微调模型的初始值
% 稀疏自编码的参数stack
stack = cell(,);%存放稀疏自编码器参数的元胞
stack{}.w = reshape(sae1OptTheta(:hiddenSizeL1*inputSize), ...
hiddenSizeL1, inputSize);
stack{}.b = sae1OptTheta(*hiddenSizeL1*inputSize+:*hiddenSizeL1*inputSize+hiddenSizeL1);
stack{}.w = reshape(sae2OptTheta(:hiddenSizeL2*hiddenSizeL1), ...
hiddenSizeL2, hiddenSizeL1);
stack{}.b = sae2OptTheta(*hiddenSizeL2*hiddenSizeL1+:*hiddenSizeL2*hiddenSizeL1+hiddenSizeL2);
[stackparams, netconfig] = stack2params(stack);%所有stack转化为向量形式,并提取稀疏自编码器的结构
% 整个模型参数(saeSoftmaxOptTheta+stack)
stackedAETheta = [ saeSoftmaxOptTheta ; stackparams ]; % 是否进行梯度检验
DEBUG=;
if DEBUG
checkStackedAECost()
end % 开始进行微调优化 (Use minFunc to minimize the function)
[stackedAEOptTheta, cost] = minFunc( @(p) stackedAECost(p, ...
inputSize, hiddenSizeL2,...%输入层维数、最后一个稀疏编码器隐藏层维数
numClasses, netconfig, ...%稀疏自编码器的结构
lambda, trainData, trainLabels), ...
stackedAETheta, options); %%======================================================================
%% STEP : Test
% 获取有标签样本集
testData = loadMNISTImages('mnist/t10k-images-idx3-ubyte');
testLabels = loadMNISTLabels('mnist/t10k-labels-idx1-ubyte');
testLabels(testLabels == ) = ; % Remap to % 进行预测(微调后的)
[pred] = stackedAEPredict(stackedAEOptTheta, inputSize, hiddenSizeL2, ...
numClasses, netconfig, testData);
acc = mean(testLabels(:) == pred(:));% 计算预测精度
fprintf('After Finetuning Test Accuracy: %0.3f%%\n', acc * ); % 进行预测(微调前的)
[pred] = stackedAEPredict(stackedAETheta, inputSize, hiddenSizeL2, ...
numClasses, netconfig, testData);
acc = mean(testLabels(:) == pred(:));% 计算预测精度
fprintf('Before Finetuning Test Accuracy: %0.3f%%\n', acc * ); % Accuracy is the proportion of correctly classified images
% The results for our implementation were: % Before Finetuning Test Accuracy: 87.7%
% After Finetuning Test Accuracy: 97.6%
%
% If your values are too low (accuracy less than %), you should check
% your code for errors, and make sure you are training on the
% entire data set of 28x28 training images
% (unless you modified the loading code, this should be the case)

 stackedAEPredict.m

% stackedAEPredict: Takes a trained theta and a test data set,
% and returns the predicted labels for each example. % theta: trained weights from the autoencoder
% visibleSize: the number of input units
% hiddenSize: the number of hidden units *at the 2nd layer*
% numClasses: the number of categories
% data: Our matrix containing the training data as columns. So, data(:,i) is the i-th training example. % Your code should produce the prediction matrix
% pred, where pred(i) is argmax_c P(y(c) | x(i)). function [pred] = stackedAEPredict(theta, inputSize, hiddenSize, numClasses, netconfig, data) %% Unroll theta parameter % We first extract the part which compute the softmax gradient
softmaxTheta = reshape(theta(:hiddenSize*numClasses), numClasses, hiddenSize); % Extract out the "stack"
stack = params2stack(theta(hiddenSize*numClasses+:end), netconfig); %% ---------- YOUR CODE HERE --------------------------------------
% Instructions: Compute pred using theta assuming that the labels start from . %% 前向传播计算
a{}=data;
depth=numel(netconfig.layersizes);
for i=:depth
a{i+}=sigmoid(bsxfun(@plus,stack{i}.w*a{i},stack{i}.b));
end %% softmax模型的输出Htheta
softmaxData=a{depth+};%softmax的输入即为stack自编码器最后一层的输出
M=softmaxTheta*softmaxData;%矩阵M
M=bsxfun(@minus,M,max(M));%减去行向量α,防止数据溢出
Htheta=bsxfun(@rdivide,exp(M),sum(exp(M)));%softmax模型的假设函数输出 %% 计算Htheta每一列最大元素所在位置,即为该列所对应样本的类别
[~,pred]=max(Htheta); end % You might find this useful
function sigm = sigmoid(x)
sigm = ./ ( + exp(-x));
end

stackedAECost.m

%{
Takes a trained softmaxTheta and a training data set with labels,
and returns cost and gradient using a stacked autoencoder model. Used for finetuning.
输入:
theta:整个网络的权值向量
visibleSize: 网络的输入层维数
hiddenSize: 最后一个稀疏自编码器的隐藏层维数
numClasses: 类别总数
netconfig: the network configuration of the stack
lambda: the weight regularization penalty
data: 训练样本集,data(:,i) is the i-th training example.
labels: 训练样本集的标签, where labels(i) is the label for the i-th training example
输出:
cost:代价函数
grad:梯度向量
%} function [ cost, grad ] = stackedAECost(theta, ...
inputSize, hiddenSize, ...%输入层维数、最后一个稀疏编码器隐藏层维数
numClasses, netconfig, ...%总类数、稀疏自编码器的结构
lambda, data, labels) %% 从输入的网络参数向量theta中得到softmax分类器和稀疏自编码器的参数
softmaxTheta = reshape(theta(:hiddenSize*numClasses), numClasses, hiddenSize);%softmax的参数矩阵
stack = params2stack(theta(hiddenSize*numClasses+:end), netconfig);% Extract out the "stack" %% 初始化
%样本个数
numCases = size(data, );
%样本标签矩阵groundTruth(即I阵)
groundTruth = full(sparse(labels, :numCases, ));
% softmax分类器的梯度
softmaxThetaGrad = zeros(size(softmaxTheta));
% 稀疏自编码器的梯度(权值w和偏执项b)
stackgrad = cell(size(stack));
for d = :numel(stack)
stackgrad{d}.w = zeros(size(stack{d}.w));
stackgrad{d}.b = zeros(size(stack{d}.b));
end %% 前向传播算法
% 初始化工作
depth=numel(stack);% 稀疏自编码器隐藏层的层数(the layor of the network)
z=cell(depth+,); % stack网络各层的激励值
a=cell(depth+,); % stack网络各层的激励值
a{}=data; % 输入层数据 % 各稀疏自编码器输出a{},...,a{depth+}
for i=:depth
%各稀疏编码器提取到的features
z{i+}=bsxfun(@plus,stack{i}.w*a{i},stack{i}.b);
a{i+}=sigmoid(z{i+});
end % softmax分类器的输出Htheta
softmaxData=a{depth+};%softmax的输入即为stack自编码器最后一层的输出
M=softmaxTheta*softmaxData;%矩阵M
M=bsxfun(@minus,M,max(M));%减去行向量α,防止数据溢出
Htheta=bsxfun(@rdivide,exp(M),sum(exp(M)));%softmax分类器的假设函数输出 %% 多层网络代价函数的计算(%要对整个网络的所有参数,包括softmax分类器和自编码器的所有参数)
cost=-sum(sum(groundTruth.*log(Htheta)))/numCases+lambda*sum(softmaxTheta(:).^)/; %% 梯度计算 % softmax层的梯度
softmaxThetaGrad=-(groundTruth-Htheta)*softmaxData'/numCases+lambda*softmaxTheta; % 稀疏自编码层
% 敏感度
delta=cell(depth+,);
delta{depth+}=-softmaxTheta'*(groundTruth-Htheta).*a{depth+1}.*(1-a{depth+1});
for i=depth:-:
delta{i}=stack{i}.w'*delta{i+1}.*(a{i}).*(1-a{i});
end
% 梯度值
for i=depth:-:
stackgrad{i}.w=delta{i+}*a{i}'/numCases;
stackgrad{i}.b=sum(delta{i+},)'/numCases;
if size(stackgrad{i}.b,)~=
stackgrad{i}.b=stackgrad{i}.b';
end
end %% Roll gradient vector
grad = [softmaxThetaGrad(:) ; stack2params(stackgrad)]; end % You might find this useful
function sigm = sigmoid(x)
sigm = ./ ( + exp(-x));
end

UFLDL教程(六)之栈式自编码器的更多相关文章

  1. UFLDL教程(一)---稀疏自编码器

    神经网络模型 简单的神经网络 前向传播 代价函数 对于单个例子 .其代价函数为: 给定一个包括m个例子的数据集,我们能够定义总体代价函数为: 以上公式中的第一项  是一个均方差项. 第二项是一个规则化 ...

  2. Deep Learning 8_深度学习UFLDL教程:Stacked Autocoders and Implement deep networks for digit classification_Exercise(斯坦福大学深度学习教程)

    前言 1.理论知识:UFLDL教程.Deep learning:十六(deep networks) 2.实验环境:win7, matlab2015b,16G内存,2T硬盘 3.实验内容:Exercis ...

  3. Deep Learning 9_深度学习UFLDL教程:linear decoder_exercise(斯坦福大学深度学习教程)

    前言 实验内容:Exercise:Learning color features with Sparse Autoencoders.即:利用线性解码器,从100000张8*8的RGB图像块中提取颜色特 ...

  4. Deep Learning 12_深度学习UFLDL教程:Sparse Coding_exercise(斯坦福大学深度学习教程)

    前言 理论知识:UFLDL教程.Deep learning:二十六(Sparse coding简单理解).Deep learning:二十七(Sparse coding中关于矩阵的范数求导).Deep ...

  5. Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)

    理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...

  6. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  7. 栈式自动编码器(Stacked AutoEncoder)

    起源:自动编码器 单自动编码器,充其量也就是个强化补丁版PCA,只用一次好不过瘾. 于是Bengio等人在2007年的  Greedy Layer-Wise Training of Deep Netw ...

  8. Deep Learning 7_深度学习UFLDL教程:Self-Taught Learning_Exercise(斯坦福大学深度学习教程)

    前言 理论知识:自我学习 练习环境:win7, matlab2015b,16G内存,2T硬盘 练习内容及步骤:Exercise:Self-Taught Learning.具体如下: 一是用29404个 ...

  9. 基于NodeJS的全栈式开发

    前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的 NodeJS,试 ...

随机推荐

  1. Making the Elephant Dance: Strategic Enterprise Analysis

    http://www.modernanalyst.com/Resources/Articles/tabid/115/ID/2934/categoryId/23/Making-the-Elephant- ...

  2. 将内容重定向到剪切板(clip.exe)

    Add-Type -Assembly PresentationCore[Windows.Clipboard]::SetText("abc中文def")先用 $output | Ou ...

  3. 晕,hibernate 的 merge和cascade="all-delete-orphan"要慎重合在一起使用

    遇到一个比较后悔莫及事情,使用了hibernate 的 merge和cascade="all-delete-orphan" ,子表数据被删除了. 1.使用cascade=" ...

  4. COCOS2D-X 精灵创建随笔

    CCSprite类中创建Sprite的方法都是静态的: static CCSprite* create ( )  创建一个无图片显示的精灵,可随后用 setTexture 方法设置显示图片 stati ...

  5. UNIX环境高级编程---标准I/O库

    前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...

  6. ViewPager的用法

    ViewPager 1.布局文件中的配置 ViewPager的路径 方法:在源码文件中输入ViewPager,按下alt+/,上面就会出来viewPager的包路径 viewPager的配置很简单,前 ...

  7. CenOs安装中文输入法

    http://jingyan.baidu.com/album/d8072ac4434666ec95cefda1.html?picindex=2 查看链接

  8. [Excel] C#GridViewExport帮助类,美化导出 (转载)

    主要功能如下1.将整GridView的数据导出到Excel中关增加一个效果线做美化最新的GridViewExport操作类看下面代码吧 /// <summary> /// 类说明:Grid ...

  9. Android 设计随便说说之简单实践(模块划分)

    上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...

  10. SQL学习:主键,外键,主键表,外键表,数据库的表与表之间的关系;

    在数据库的学习中,对于一个表的主键和外键的认识是非常重要的. 主键:在一个表中,能唯一的表示一个事物(或者一条记录)的字段,我们称之为主键 注意: 主键的设置可以不只是用一个字段,也可以用若干个字段的 ...