最近在学习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提取了图像的边缘。本章相对比较容易。
ios7数据合并——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十三)