UFLDL学习笔记6(Linear Decoders with Autoencoders)
UFLDL学习笔记6(Linear Decoders with Autoencoders)
最近在学习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 --------------------
运行结果
小结
同样发现Linear Decoders with Autoencoders提取了图像的边缘。本章相对比较容易。

浙公网安备 33010602011771号