Matlab 为什么这是神经网络成本函数的正确方法?
因此,在我的头撞到墙上几个小时后,我在网上寻找我的问题的解决方案,效果很好。我只是想知道是什么原因导致了我最初处理问题的方式 这里有更多的细节。输入是来自MNIST数据集的20x20px图像,有5000个样本,因此X或A1是5000x400。单个隐藏层中有25个节点。输出为0-9位的一个热向量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
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(