UFLDL学习笔记(6)

最近在学习UFLDL Tutorial,这是一套关于无监督学习的教程。在此感觉Andrew Ng做的真的是非常认真。下面把我的代码贴出来,方便大家学习调试。所有代码已经过matlab调试通过。


Linear Decoders with Autoencoders

这一章是第一章Sparse Autoencoder变化版。第一章的Sparse Autoencoder两层都用的是sigmoid映射,那么输出一定在0-1之间,因此数据在输入之前必须规整到0-1之间。本章的Sparse Autoencoder第二层不用sigmoid,直接输出,因此叫做Linear Decoder,可以获得任意范围的值。本章用的数据是彩色的,因此输入结点数*3。代码编写十分简单。


代码编写

sparseAutoencoderLinearCost.m 获得损失函数及权值梯度。只需要把第一章中的sparseAutoencoderCost.m拷过来稍加改动即可。在此把整个.m的代码贴出来。代码:

function [cost,grad,features] = sparseAutoencoderLinearCost(theta, visibleSize, hiddenSize, ...
                                                            lambda, sparsityParam, beta, data)
% -------------------- YOUR CODE HERE --------------------
% 该代码拷贝自sparseAutoencoderLinearCost.m,只修改了A3和dEdO3两行,其它不动。

% 初始化
W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize);
W2 = reshape(theta(hiddenSize*visibleSize+1:2*hiddenSize*visibleSize), visibleSize, hiddenSize);
b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);
b2 = theta(2*hiddenSize*visibleSize+hiddenSize+1:end);

cost = 0;
W1grad = zeros(size(W1)); 
W2grad = zeros(size(W2));
b1grad = zeros(size(b1)); 
b2grad = zeros(size(b2));

% 获得每层输出
[dim,sampleN] = size(data);
X = data;
O2 = W1*X + b1*ones(1,sampleN);
A2 = sigmoid(O2);
O3 = W2*A2 + b2*ones(1,sampleN);
A3 = O3;
tmpM = (A3-X).*(A3-X);

% 稀疏代价
p = sum(A2,2) / sampleN;
q = sparsityParam;
kl = KL(q,p);

% 损失函数
E = 0.5 * sum(tmpM(:)) / sampleN + 0.5 * lambda * (sum(sum(W1.*W1)) + sum(sum(W2.*W2))) + beta * sum(kl);
cost = E;

% 获得权值梯度
dEdO3 = (A3-X);
dEdO2 = (W2‘*dEdO3 + beta*(-q./p + (1-q)./(1-p)) * ones(1,sampleN)) .* A2 .* (1-A2);

W2grad = dEdO3*A2‘ / sampleN + lambda*W2;
b2grad = sum(dEdO3,2) / sampleN;
W1grad = dEdO2*X‘ / sampleN + lambda*W1;
b1grad = sum(dEdO2,2) / sampleN;

% 格式化输出
grad = [W1grad(:) ; W2grad(:) ; b1grad(:) ; b2grad(:)];                                

end

function sigm = sigmoid(x)
    sigm = 1 ./ (1 + exp(-x));
end

function kl = KL(q, p)
    kl = q * log(q./p) + (1-q) * log((1-q)./(1-p));
end

% -------------------- YOUR CODE HERE --------------------    

运行结果

UFLDL学习笔记(6)


小结

同样发现Linear Decoders with Autoencoders提取了图像的边缘。本章相对比较容易。

UFLDL学习笔记(6)

上一篇:POJ 2240 Arbitrage(最短路 Floyd)


下一篇:用 C# 编写 USB 存储设备使用痕迹检测和删除工具