Matlab 为什么这是神经网络成本函数的正确方法?

Matlab 为什么这是神经网络成本函数的正确方法?,matlab,neural-network,vectorization,octave,backpropagation,Matlab,Neural Network,Vectorization,Octave,Backpropagation,因此,在我的头撞到墙上几个小时后,我在网上寻找我的问题的解决方案,效果很好。我只是想知道是什么原因导致了我最初处理问题的方式 这里有更多的细节。输入是来自MNIST数据集的20x20px图像,有5000个样本,因此X或A1是5000x400。单个隐藏层中有25个节点。输出为0-9位的一个热向量y(不是y,它是y的一个热编码)是值为1-10的5000x1向量 这是我的成本函数的原始代码: Y = zeros(m, num_labels); for i = 1:m Y(i, y(i

因此,在我的头撞到墙上几个小时后,我在网上寻找我的问题的解决方案,效果很好。我只是想知道是什么原因导致了我最初处理问题的方式

这里有更多的细节。输入是来自MNIST数据集的20x20px图像,有5000个样本,因此X或A1是5000x400。单个隐藏层中有25个节点。输出为0-9位的一个热向量
y
(不是y,它是y的一个热编码)是值为1-10的5000x1向量

这是我的成本函数的原始代码:

Y = zeros(m, num_labels);
   for i = 1:m
   Y(i, y(i)) = 1; 
endfor
H = sigmoid(Theta2*[ones(1,m);sigmoid(Theta1*[ones(m, 1) X]'))
J = (1/m) * sum(sum((-Y*log(H]))' - (1-Y)*log(1-H]))')))
但后来我发现:

A1 = [ones(m, 1) X];
Z2 = A1 * Theta1';
A2 = [ones(size(Z2, 1), 1) sigmoid(Z2)];
Z3 = A2*Theta2';
H = A3 = sigmoid(Z3);

J = (1/m)*sum(sum((-Y).*log(H) - (1-Y).*log(1-H), 2));
我知道这可能会稍微干净一点,但从功能上讲,是什么导致我的原始代码得到了
304.88
,而另一个得到了~
0.25
?它是元素级乘法吗

仅供参考,这是同样的问题,如果你需要写出形式方程


谢谢你给我的任何帮助!我真的很想知道我哪里出了问题

从评论转移过来:

快速看一看,在
J=(1/m)*sum(sum((-Y*log(H]))—(1-Y)*log(1-H]))
中,括号肯定有问题,但可能与您如何将其粘贴在此处有关,而不是与原始代码有关,因为这会在运行时引发错误。如果我理解正确,Y,H是矩阵,那么在你的第一个版本中,
Y*log(H)
是矩阵乘法,而在第二个版本中,
Y*log(H)
是逐项乘法(不是矩阵乘法,只是
c(I,j)=a(I,j)*b(I,j)

更新1:
关于你在评论中的问题。 从第一个屏幕截图开始,您将Y矩阵的条目
Y(i,k)
中的每个值yk(i)表示为
h(i,k)
。基本上,对于每个i,k,你要计算
Y(i,k)log(H(i,k))+(1-Y(i,k))log(1-H(i,k))
。您可以对所有值一起执行此操作,并将结果存储在矩阵C中。然后,
C=Y.*log(H)+(1-Y)。*log(1-H)
,每个C(i,k)都具有上述值。这是一个操作*,因为您希望对每个矩阵的每个元素(i,k)执行该操作(与此相反,它是完全不同的)。然后,为了得到二维矩阵C中所有值的和,您使用倍频程函数
sum
两次:
sum(sum(C))
对列和行进行求和(或者按照@Irreducible的建议,只需
sum(C(:)


注意,可能还有其他错误。

从注释转移:

快速看一看,在
J=(1/m)*sum(sum((-Y*log(H]))—(1-Y)*log(1-H]))
中,括号肯定有问题,但可能与您如何将其粘贴在此处有关,而不是与原始代码有关,因为这会在运行时引发错误。如果我理解正确,Y,H是矩阵,那么在你的第一个版本中,
Y*log(H)
是矩阵乘法,而在第二个版本中,
Y*log(H)
是逐项乘法(不是矩阵乘法,只是
c(I,j)=a(I,j)*b(I,j)

更新1:
关于你在评论中的问题。 从第一个屏幕截图开始,您将Y矩阵的条目
Y(i,k)
中的每个值yk(i)表示为
h(i,k)
。基本上,对于每个i,k,你要计算
Y(i,k)log(H(i,k))+(1-Y(i,k))log(1-H(i,k))
。您可以对所有值一起执行此操作,并将结果存储在矩阵C中。然后,
C=Y.*log(H)+(1-Y)。*log(1-H)
,每个C(i,k)都具有上述值。这是一个操作*,因为您希望对每个矩阵的每个元素(i,k)执行该操作(与此相反,它是完全不同的)。然后,为了得到二维矩阵C中所有值的和,您使用倍频程函数
sum
两次:
sum(sum(C))
对列和行进行求和(或者按照@Irreducible的建议,只需
sum(C(:)


注意,可能还有其他错误。

?这样我们就可以看到这两个代码实际起作用了?@tryman这两个屏幕抓取有助于清除它吗?整个问题只是为一个神经网络编写一个成本函数Octave@tryman我添加了更多的细节。希望这将通过快速查看清除所有内容,在
J=(1/m)*sum(sum((-Y*log(H]))-(1-Y)*log(1-H]))
中,括号肯定有问题,但可能与您如何将其粘贴在此处有关,而不是与原始代码有关,因为这会在运行时引发错误。如果我理解正确,Y,H是矩阵,那么在你的第一个版本中,
Y*log(H)
是矩阵乘法,而在第二个版本中,
Y*log(H)
是逐项乘法(不是矩阵乘法,只是c(I,j)=a(I,j)*b(I,j))。@tryman谢谢!我真正想弄明白的是,我是如何知道如何做元素相乘而不是矩阵相乘的,只是从上面的方程和图。因为在这个等式中,y和log没有某种形式的,从技术上来说,这意味着它是元素方面的吗?或者这里还有什么我不知道的?这样我们就可以看到这两个代码实际起作用了?@tryman这两个屏幕抓取有助于清除它吗?整个问题只是为一个神经网络编写一个成本函数Octave@tryman我添加了更多的细节。希望这将通过快速查看清除所有内容,在
J=(1/m)*sum(sum((-Y*log(H]))-(1-Y)*log(1-H]))
中,括号肯定有问题,但可能与您如何将其粘贴在此处有关,而不是与原始代码有关,因为这会在运行时引发错误。如果我理解正确,Y,H是矩阵,那么在第一个版本中
Y*log(H)
是矩阵乘法,而在第二个版本中
Y*log(