exercise4

来源:互联网 发布:outlook mac 下载 编辑:程序博客网 时间:2024/05/16 23:54

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

这次做的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);%开始计算JJ=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';endTheta1_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要进行这个运算。向后传播的原理已经明白 。

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

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