web-dev-qa-db-ja.com

バイナリクロスエントロピー損失計算におけるnp.dotとnp.multiplyのnp.sumとの違い

私は次のコードを試しましたが、np.dotnp.multiply with np.sumの違いを見つけられませんでした

np.dot code

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 with 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
20
Asad Shakeel

np.dotは、2つのマトリックスの ドット積 です。

|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は、2つの行列の 要素ごとの乗算 を実行します。

|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
42
Anuj Gautam

YA2が(1、N)配列の場合、np.dot(Y,A.T)は(1,1)の結果を生成します。 (1、N)と(N、1)の行列乗算を行っています。 N'sが合計され、(1,1)が残ります。

multiplyの場合、結果は(1、N)です。すべての値を合計すると、結果はスカラーになります。

YA2が(N、)形(同じ数の要素、ただし1d)の場合、np.dot(Y,A2).Tなし)もスカラーを生成します。 np.dotドキュメントから:

2次元配列の場合は行列の乗算に相当し、1次元配列の場合はベクトルの内積に相当します

Aとbの内積を返します。 aとbが両方ともスカラーまたは両方が1次元配列の場合、スカラーが返されます。それ以外の場合、配列が返されます。

squeezeはすべてのサイズ1の次元を削減しますが、配列を返します。 numpyでは、配列は任意の数の次元(0〜32)を持つことができます。したがって、0d配列が可能です。 np.array(3)np.array([3])、およびnp.array([[3]])の形状を比較します。

3
hpaulj
In this example it just not a coincidence. Lets take an example we have two (1,3) and (1,3) matrices. 
// Lets code 

import numpy as np

x1=np.array([1, 2, 3]) // first array
x2=np.array([3, 4, 3]) // second array

//Then 

X_Res=np.sum(np.multiply(x1,x2)) 
// will result 20 as it will be calculated as - (1*3)+(2*4)+(3*3) , i.e element wise
// multiplication followed by sum.

Y_Res=np.dot(x1,x2.T) 

// in order to get (1,1) matrix) from a dot of (1,3) matrix and //(1,3) matrix we need to //transpose second one. 
//Hence|1 2 3| * |3|
//               |4| = |1*3+2*4+3*3| = |20|
//               |3|
// will result 20 as it will be (1*3)+(2*4)+(3*3) , i.e. dot product of two matrices

print X_Res //20

print Y_Res //20
0
Ashish S