这里把Sparse Autoencoder编程练习的代码和结果记录下来。
UFLDL源代码 http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder
1. 部分代码
Sparse Autoencoder的练习需要完成sampleIMAGES.m、sparseAutoencoderCost.m、computeNumericalGradient.m三个程序文件。
主程序文件是train.m,先来看看train.m来对稀疏编码有个大致印象。
1.1 train.m(不需改动)
%% CS294A/CS294W Programming Assignment Starter Code%
%
%%======================================================================
%% STEP 0: 设置一些参数,这里不需要修改
visibleSize = 8*8; % 输入节点个数
hiddenSize = 25; % 输出节点个数
sparsityParam = 0.01; % 隐层节点平均激活度,也就是教程里的稀疏性参数rho
lambda = 0.0001; % 权重衰减参数
beta = 3; % 稀疏权值惩罚项
%%======================================================================
%% STEP 1: 完成sampleIMAGES
%
% 采样完成后,display_newwork命令会显示其中的200个样本
patches = sampleIMAGES;
display_network(patches(:,randi(size(patches,2),200,1)),8);
% 参数随机初始化,theta是列向量(W1,W2,b1,b2)
theta = initializeParameters(hiddenSize, visibleSize);
%%======================================================================
%% STEP 2: 完成sparseAutoencoderCost
%
% 代价函数里需要计算平方误差代价、权值衰减项、稀疏惩罚三项。建议按以下步骤编写,
% 每写完一个进行一次梯度检验(step3)
% (a) 先计算前向传播结果, 然后计算代价函数的平方误差项,再计算反向传播导数。
% 可以令lambda=beta=0,进行梯度检验确保平方误差代价计算正确
% (b) 在代价函数和偏导中加入权重衰减项,进行梯度检验确保正确
% (c) 添加稀疏惩罚项,进行梯度检验
%
% 运行成功后,可以尝试修改相关参数,如训练集大小、隐层节点数量、beta=lambda=0.
[cost, grad] = sparseAutoencoderCost(theta, visibleSize, hiddenS