python - np.dot 和 np.multiply 与 np.sum 在二进制交叉熵损失计算中的区别

标签 python numpy neural-network sum difference

我尝试了以下代码,但没有发现 np.dotnp.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.dotdot 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/

相关文章:

python - 在python中获取列组合及其各自索引的乘积的最大值

python - 一维数组转换 : Distributing groups of different sizes into unique batches with certain conditions

python - Tensorflow 中的 Dice/Jaccard 系数优化

multithreading - tensorflow 输入管道中的线程

Python Tkinter - 在窗口中均匀调整小部件的大小

python - 对一组自动化测试只运行一次 setUp

python - 什么决定了 numpy 在除以零时是返回 NAN 还是 INF

python - 分类特征编码作为 Scikit-Learn 的枚举

Python:多行输入转换为列表

python - Tensorflow - 训练后检索训练后的前馈神经网络的权重/偏差