Programming Exercise 4:Neural Networks Learning
1.神经网络
1.1 观察数据
本次实验数据与实验3一样,是m=5000个手写数字的灰阶图像。其中每个数字(0--9)各500个,每个图像为20x20的像素。所以X为5000x400的Matrix。Y对应每个图像的值(10 -- 9)10代表数字0。displayData函数将从数据集X中随机选100条数据即100个手写数字图像显示出来,由于是随机的故每次执行ex4后看到的会不一样。
1.2 模型表示
本次实验使用的神经网络模型共3层,1输入,1隐藏层,1输出。像素为20x20所以输入有400个单元,再加一个偏置就是401。在ex4weights.mat中提供了参数Theta1和Theta2,Theta1为25x401的Matrix,Theta2为10x26的matrix,使用matlabR2014b打开可看到。或者load('ex4weights.mat')后用whos可看。
1.3前馈与代价函数
打开nnCostFunction.m文件输入以下代码
t1 = 0;
X = [ones(m,1),X]; %给X加上x0=1
a2 = sigmoid(X * (Theta1')); %a2为隐藏层的值
m2=size(a2,1);
a2 = [ones(m2,1),a2];%给隐藏层加上偏置,通常为1
h = sigmoid(a2 *(Theta2'));%假设函数公式
s1 = Theta1(:,2:end);%算正则化用的,偏置不进行正则化
s2 = Theta2(:,2:end);
Regular1 = sum(sum(s1.^2));
Regular2 = sum(sum(s2.^2));
Regular=lambda/(2*m)*(Regular1+Regular2);%正则化项
for i=1:num_labels,%循环求和,从1到m
t1 = t1 +sum(-(y==i).*log(h(:,i))-(1-(y==i)).*log(1-(h(:,i))));%注意用y==i使y由1--10变换为01的向量
end
J = 1/m*t1+Regular;%代价函数J
以上代码
手写数字0--9共10组分类,K=10,若K=1或K=2就只要分2类。
1.4 正则化代价函数
公式:
代码如1.3.
2反向传播
通过反向传播算法计算神经网络代价函数的梯度(gradient)
2.1曲线函数的梯度
公式:
打开sigmoidGradient.m文件,输入以下代码:
g=sigmoid(z).*(1-sigmoid(z));
以上代码
测试sigmoidGradient(0)输出0.25,sigmoidGradient(10)输出极小值约为0
2.2初始化随机参数
打开randInitializeWeights.m文件输入以下代码
% Randomly initialize the weights to small values
epsilon_init = 0.12;
W = rand(L_out, 1 + L_in) * 2 * epsilon_init - epsilo_ init;
以上代码。
2.3反向传播
5步完成。
第一步,通过前馈(feedforward)来计算各层激励,a(1)层a(2)层需加上偏置。这部分其实1.3的代码就完成了。注意此时参数theta1,theta2不是ex4weights.mat里的了,是ex4.m中做的2.2后得到的。
这里做一个for循环。注意要把Y的1--10变为01的向量。
代码如下:
% step 2
delta3 = zeros(m,num_labels);
for i=1:num_labels,
delta3(:,i) = h(:,i)-(y==i);
end
% step 3
delta2 = delta3*s2.*sigmoidGradient(X*(Theta1') );
% step 4
DLT1=(delta2')*X;
DLT2=(delta3')*a2;
% step 5 unRegularized--------
%Theta1_grad = 1/m*DLT1;
%Theta2_grad = 1/m*DLT2;
%-----------------------------
% 2.5 Regularized Neural Network
Theta1_grad = 1/m*DLT1 + lambda/m*Theta1;
Theta1_grad(:,1) = Theta1_grad(:,1) - lambda/m*Theta1(:,1);
Theta2_grad = 1/m*DLT2 + lambda/m*Theta2;
Theta2_grad(:,1) = Theta2_grad(:,1) - lambda/m*Theta2(:,1);
以上代码
2.4梯度检查
看看computeNumericalGradient.m文件理解程序,不必修改,运行checkNNGradients来进行检查。差别应小于1e-9.
2.5正则化神经网络
添加正则化项即可,2.3代码已经加入。
至此可提交代码。