exercise4

又是周一了,又来这里开始做题啦。

这次做的exercise4,开始正式进入神经网络的世界。

本文中所涉及的是一级神经网络。第一层的维度是400,代表20X20的像素;第二层就是中间层,维度是25,最后一层的维度为10,代表是10的数字分别的可能性。

最基本的,重要的计算神经网络中的损失函数,可以直接套用:

%现在开始复习神经网络的过程
%首先要明确,每一行是一个X,所以需要在最最左边增加一列1,变成5000X401的数据
%b([1:size(X,1)],1)=1;
a0=[b,X];
z1=a0*Theta1';
%得到的结果是5000X25的矩阵
a1=sigmoid(z1);
%需要将结果变成5000X26的矩阵
b([1:size(a1,1)],1)=1;
a1=[b,a1];
%进行中间层到结果层的计算
z2=a1*Theta2';
%得到的结果是5000X10的矩阵
a2=sigmoid(z2);

%开始计算J
J=sum(sum(-y_cacu.*log(a2)-(1-y_cacu).*log(a2)))/m;

上面的例子中,原始数据共有5000个,为400维,中间的神经元的维度为25,最终结果的维度是10。但是可以直接使用,因为没有使用直接的数字。

但过一段时间后发现是有错误的。最明显的错误就是J的计算式写错了。

现在提供正确的算法:

%如果要计算J的话,需要将输入的向量y进行处理
%y的数值对应的部分为1,其他部分为0。
y_cacu=zeros(m,num_labels);
for i=1:size(y_cacu,1)
    y_cacu(i,y(i))=1;
end
%现在开始复习神经网络的过程
X=[ones(m,1) X];
a1=sigmoid(X*Theta1');
a1=[ones(m,1) a1];
a2=sigmoid(a1*Theta2');

theta1_t=[zeros(size(Theta1,1),1) Theta1(:,2:end)];
theta2_t=[zeros(size(Theta2,1),1) Theta2(:,2:end)];
cost=y_cacu .* log(a2) + (1 - y_cacu) .* log(1 - a2);
cost=-sum(sum(cost))/m;
theta1_t = theta1_t.^2;
theta2_t = theta2_t.^2;
J=cost + lambda / (2 * m) *(sum(sum(theta1_t)) + sum(sum(theta2_t)));
这里要强调一下对矩阵中的所有元素求和,千万不要忘了求和这个步骤。


之后开始进入循环不断计算梯度:

%现在开始正式进行本文的运算
grad1=zeros(size(Theta1));
grad2=zeros(size(Theta2));
for i=1:m
    a1=X(i,:)';%401x1
    z2=Theta1*a1;%25x1
    a2=sigmoid(z2);%25*1;
    a2=[1;a2];%26x1
    z3=Theta2*a2;%10x1
    a3=sigmoid(z3);%10x1
    
    %之后开始计算损失
    %error3
    error3=zeros(size(a3));
    for j=1:num_labels
        error3(j)=a3(j)-(y(i)==j);
    end
    %error2
    error2=Theta2'* error3;
    error2=error2(2:end,:) .* sigmoidGradient(z2);
    
    %计算gradient
    grad2 = grad2 + error3 * a2';
    grad1 = grad1 + error2 * a1';
end
Theta1_temp = [zeros(size(Theta1,1),1) Theta1(:,2:end)];
Theta2_temp = [zeros(size(Theta2,1),1) Theta2(:,2:end)];
Theta1_final=grad1 / m + lambda / m * Theta1_temp;
Theta2_final=grad2 / m + lambda / m * Theta2_temp;
grad = [Theta1_final(:) ; Theta2_final(:)];

这就是本次联系最重要的部分,但最终还不理解的就是为什么grad要进行这个运算。向后传播的原理已经明白 。

推荐一个讲解:点击打开链接真的很清楚明白。

之后再这个联系中就没有什么难点了,这个练习到这里就可以结束了。
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值