неправильная точечная форма продукта - PullRequest
0 голосов
/ 08 ноября 2018

В рамках моего упражнения с Numpy я попробовал приведенный ниже код.

import numpy as np

inputAttributes  = 32
outputAttributes = 64
noOfElements = 3


inputData = np.random.random((noOfElements, inputAttributes))
weights = np.random.random((outputAttributes, inputAttributes))

extrawegiths = np.random.random((outputAttributes, outputAttributes))
extraInput = np.random.random((outputAttributes,))

eachLayerOutput =[]

for eachData in inputData:
    print ("---------------")
    print (weights.shape, eachData.shape)
    print (extrawegiths.shape, extraInput.shape)
    result = np.dot(weights,eachData)  +  np.dot(extrawegiths, extraInput)          
    print (result.shape)
    print ("---------------")

Мой вывод был следующим:

((64, 32), (32,))
((64, 64), (64,))
(64,)

Если я интерпретирую, тогда

  (64, 32 ) * (32, ) => (64, )

  (64, 64 ) * (64, ) => (64, )

  (64,    ) + (64, ) => (64, )

Пока все хорошо, теперь я изменяю форму extraInput на #, добавляя '1'

extraInput = np.random.random((outputAttributes, 1)

Теперь я получил результат, который не могу понять.

((64, 32), (32,))
((64, 64), (64, 1))
(64, 64)

Если я интерпретирую, тогда

  (64, 32 ) * (32, ) => (64, )

  (64, 64 ) * (64,1) => (64,1)

  (64,    ) + (64, 1) => (64, 64 )

КАК (64,) + (64, 1) ВЕДЕТ (64,64)?

1 Ответ

0 голосов
/ 08 ноября 2018

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html#general-broadcasting-rules

При работе с двумя массивами NumPy сравнивает их формы поэлементно. Он начинается с конечных размеров и продвигается вперед. Два размера совместимы, когда

   1. they are equal, or
   2. one of them is 1

Последнее измерение одного из ваших массивов равно 1, вызывая правило 2.

Если вы хотите сохранить форму массива как (64,) или как (64, 1), я бы предложил явное:

Предполагая, что a имеет форму (64,), а b имеет форму (64,1):

a + b[:,0]          # shape (64,)
a[:,np.newaxis] + b # shape (64, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...