coursera Stanford Machine Learning Week5 Ex4机器学习 实验4

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后得到的。

第二步,对于输出层的K=10个单元,有

这里做一个for循环。注意要把Y的1--10变为01的向量。

第三步,对于第2层(隐藏层)有

第四步,公式

第五步,公式

代码如下:

% 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代码已经加入。

 

至此可提交代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值