Week 5 编程作业

1.3 Feedforward and cost function
 

1、前向传播,从输入层到隐藏层,再到输出层,一步步计算,得出h

2、输入该函数的y是一个5000*1的矩阵,需要把他变成5000*10的矩阵,如下

3、利用代价函数公式计算J

%nnCostFunction.m
%compute h
X=[ones(m,1),X];
a1=X;
z2=a1*Theta1';
a2=sigmoid(z2);
a2=[ones(m,1),a2];   %add one column
z3=a2*Theta2';
a3=sigmoid(z3);
h=a3;

%compute y
for i=1:m
    temp=y(i);
    for j=1:10
        if j==temp
            y(i,j)=1;
        else
            y(i,j)=0;
        end
    end
end

for i =1:m   
    for j=1:num_labels
        J=J-y(i,j)*log(h(i,j))-(1-y(i,j))*log(1-h(i,j));
    end
end
    
J=1/m*J;

1.4 Regularized cost function 

 

%regularized
J=J+(sum(sum(Theta1(:,2:end).*Theta1(:,2:end)))+sum(sum(Theta2(:,2:end).*Theta2(:,2:end))))*lambda/2/m;
2.1 Sigmoid gradient

sigmoidGradient.m
g=sigmoid(z).*(1-sigmoid(z));

 2.3 Backpropagation

感觉自己在写反向传播之前一直都没搞懂每一步要算的是什么,导致一个代码写了一晚上才搞出来,也明白了反向传播

在第一问的前向传播代码基础上,

1、计算输出层,隐藏层的delta ,即delta3,delta2

2、J对每一个theta值求导,

theta1,即从输入层传递到隐藏层,在这个例子中size为25*401

theta2,即从隐藏层传递到输出层,在这个例子中size为10*26

J对theta l求偏导可用来求

m个训练样例,每次将该值相加,即(这里的delta即为Theta1_grad、Theta2_grad,即J对theta求的偏导)

(Theta1_grad(i,j)的值,即J对theta1(i,j)求得偏导数)

3、再除以m,得最终结果

X=[ones(m,1),X];   %给X添加一列1
delta3=h-y;   %5000*10 5000个样本,10个输出单元
delta2=delta3*Theta2.*sigmoidGradient([ones(m,1),z2]);   %5000*26  5000个样本,26个隐藏层单元(但其实第一个对他没影响)
for t=1:m  
    %计算误差矩阵,对每一个theta值都求导数
    Theta2_grad=Theta2_grad+delta3(t,:)'*a2(t,:);
    Theta1_grad=Theta1_grad+delta2(t,2:end)'*a1(t,:);
end
Theta1_grad=1/m*Theta1_grad;
Theta2_grad=1/m*Theta2_grad;
2.5 Regularized Neural Networks

 

Theta1_grad=1/m*Theta1_grad;
Theta2_grad=1/m*Theta2_grad;
Theta1_grad(:,2:end)=Theta1_grad(:,2:end)+lambda/m*Theta1(:,2:end);
Theta2_grad(:,2:end)=Theta2_grad(:,2:end)+lambda/m*Theta2(:,2:end);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值