繁体   English   中英

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

[英]Why is this the correct way to do a cost function for a neural network?

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

在此处输入图片说明

在此处输入图片说明

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

在此处输入图片说明

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

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(x ^(i))k的每个值表示为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中所有值的总和,请使用两次倍频程函数sumsum(sum(C))将列和行总和(或如@ Irreducible建议的那样,只求sum(C(:)) )。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM