我尝试了以下代码,但没有发现 np.dot 和 np.multiply 与 np.sum 之间的区别
这里是 np.dot 代码
logprobs = np.dot(Y, (np.log(A2)).T) + np.dot((1.0-Y),(np.log(1 - A2)).T)
print(logprobs.shape)
print(logprobs)
cost = (-1/m) * logprobs
print(cost.shape)
print(type(cost))
print(cost)
它的输出是
(1, 1)
[[-2.07917628]]
(1, 1)
<class 'numpy.ndarray'>
[[ 0.693058761039 ]]
这是 np.multiply 与 np.sum 的代码
logprobs = np.sum(np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2)))
print(logprobs.shape)
print(logprobs)
cost = - logprobs / m
print(cost.shape)
print(type(cost))
print(cost)
它的输出是
()
-2.07917628312
()
<class 'numpy.float64'>
0.693058761039
我无法理解类型和形状的差异,而两种情况下的结果值相同
即使在压缩前代码的情况下成本值与后相同但类型保持相同
cost = np.squeeze(cost)
print(type(cost))
print(cost)
输出是
<class 'numpy.ndarray'>
0.6930587610394646
最佳答案
np.dot
是 dot product两个矩阵。
|A B| . |E F| = |A*E+B*G A*F+B*H|
|C D| |G H| |C*E+D*G C*F+D*H|
而 np.multiply
执行 element-wise multiplication两个矩阵。
|A B| ⊙ |E F| = |A*E B*F|
|C D| |G H| |C*G D*H|
与 np.sum
一起使用时,结果相等只是巧合。
>>> np.dot([[1,2], [3,4]], [[1,2], [2,3]])
array([[ 5, 8],
[11, 18]])
>>> np.multiply([[1,2], [3,4]], [[1,2], [2,3]])
array([[ 1, 4],
[ 6, 12]])
>>> np.sum(np.dot([[1,2], [3,4]], [[1,2], [2,3]]))
42
>>> np.sum(np.multiply([[1,2], [3,4]], [[1,2], [2,3]]))
23
关于python - np.dot 和 np.multiply 与 np.sum 在二进制交叉熵损失计算中的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201729/