[英]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中所有值的总和,请使用两次倍频程函数sum
: sum(sum(C))
将列和行总和(或如@ Irreducible建议的那样,只求sum(C(:))
)。
请注意,可能还会有其他错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.