Вопрос:

Разница между np.dot и np.multiply с np.sum в вычислении двоичной кросс-энтропийной потери

python numpy neural-network sum difference

18345 просмотра

4 ответа

384 Репутация автора

Я пробовал следующий код, но не нашел разницы между 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
Автор: Asad Shakeel Источник Размещён: 11.01.2018 07:21

Ответы (4)


42 плюса

667 Репутация автора

np.dotявляется точечным произведением двух матриц.

|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, что поэлементное умножение двух матриц.

|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
Автор: Anuj Gautam Размещён: 11.01.2018 07:36

3 плюса

124173 Репутация автора

Если Yи A2являются (1, N) массивами, то np.dot(Y,A.T)будет получен результат (1,1). Делается матричное умножение (1, N) на (N, 1). N'sСуммируются, в результате чего (1,1).

В multiplyрезультате получается (1, N). Суммируйте все значения, и результат будет скалярным.

Если бы Yи A2были (N,) в форме (то же количество элементов, но 1d), np.dot(Y,A2)(нет .T) также будет производить скаляр. Из np.dotдокументации:

Для двумерных массивов это эквивалентно умножению матриц, а для двумерных массивов - внутреннему произведению векторов

Возвращает произведение точек a и b. Если a и b оба являются скалярами или одномерными массивами, то скаляр возвращается; в противном случае массив возвращается.

squeezeуменьшает все размеры размера 1, но по-прежнему возвращает массив. В numpyмассиве может быть любое количество измерений (от 0 до 32). Так что массив 0d возможен. Сравните форму np.array(3), np.array([3])и np.array([[3]]).

Автор: hpaulj Размещён: 11.01.2018 07:41

13 плюса

22258 Репутация автора

Решение

То, что вы делаете, это вычисление двоичной кросс-энтропийной потери, которая измеряет, насколько плохи предсказания (здесь:) A2модели по сравнению с истинными результатами (здесь:) Y.

Вот воспроизводимый пример для вашего случая, который должен объяснить, почему вы получаете скаляр во втором случае, используя np.sum

In [88]: Y = np.array([[1, 0, 1, 1, 0, 1, 0, 0]])

In [89]: A2 = np.array([[0.8, 0.2, 0.95, 0.92, 0.01, 0.93, 0.1, 0.02]])

In [90]: logprobs = np.dot(Y, (np.log(A2)).T) + np.dot((1.0-Y),(np.log(1 - A2)).T)

# `np.dot` returns 2D array since its arguments are 2D arrays
In [91]: logprobs
Out[91]: array([[-0.78914626]])

In [92]: cost = (-1/m) * logprobs

In [93]: cost
Out[93]: array([[ 0.09864328]])

In [94]: logprobs = np.sum(np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2)))

# np.sum returns scalar since it sums everything in the 2D array
In [95]: logprobs
Out[95]: -0.78914625761870361

Обратите внимание, что np.dotсуммы по внутренним измерениям совпадают (1x8) and (8x1). Таким образом, значения 8s исчезнут во время умножения скалярного произведения или матрицы , что даст результат, (1x1)который является просто скаляром, но возвращается как двумерный массив формы (1,1).


Кроме того, самое главное, обратите внимание, что здесь np.dotвсе точно так же, как иnp.matmul в случае, когда входными данными являются двумерные массивы (т.е. матрицы).

In [107]: logprobs = np.matmul(Y, (np.log(A2)).T) + np.matmul((1.0-Y),(np.log(1 - A2)).T)

In [108]: logprobs
Out[108]: array([[-0.78914626]])

In [109]: logprobs.shape
Out[109]: (1, 1)

Вернуть результат в виде скалярного значения

np.dotили np.matmulвозвращает любую форму результирующего массива, основываясь на входных массивах. Даже с out=аргументом невозможно вернуть скаляр , если входные данные являются двумерными массивами. Тем не менее, мы можем использовать np.asscalar()результат для преобразования его в скаляр, если массив результатов имеет форму (1,1)(или, в более общем случае, скалярное значение, заключенное в массив nD)

In [123]: np.asscalar(logprobs)
Out[123]: -0.7891462576187036

In [124]: type(np.asscalar(logprobs))
Out[124]: float

ndarray от размера 1 до скалярного значения

In [127]: np.asscalar(np.array([[[23.2]]]))
Out[127]: 23.2

In [128]: np.asscalar(np.array([[[[23.2]]]]))
Out[128]: 23.2
Автор: kmario23 Размещён: 11.01.2018 07:57

0 плюса

26 Репутация автора

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
Автор: Ashish S Размещён: 03.08.2018 09:16
Вопросы из категории :
32x32