почему эти матрицы не транслируются вместе?ValueError: операнды не могут быть переданы вместе с фигурами (5,2) (2,1) - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь настроить обратное распространение для моей нейронной сети, используя numpy, но по какой-то причине, когда я устанавливаю уравнение приличия градиента для матрицы, которая содержит мои выходные веса, две из матрицы (2,5)(5,1) в градиентном приличном уравнении не вещают вместе.Я делаю это неправильно?

Я пытался разбить уравнение на разные части, чтобы увидеть, есть ли что-то еще, что может быть причиной этого, но до сих пор я указал его конкретно на всематрица в числителе и вся матрица в знаменателе (градиентное порядочное уравнение является дробной).Я также подумал, что это может происходить между исходными весами вывода и уравнением достойного градиента, но это также неверно, потому что матрица для выходных весов равна (5,2), а не (2,5).Я также пробовал функции, отличные от numpy.divide, например, используя numpy.dot для умножения первого уравнения на второе до степени -1.

рассеченный код

self.outputWeights = self.outputWeights - l * 

#numarator
( -numpy.divide((2 * (numpy.dot(y.reshape(self.outputs, 1), (1+numpy.power(e, -n-b))).reshape(self.neurons, self.outputs)-w)).reshape(self.outputs, self.neurons), 

#denominator
(numpy.power(1+ numpy.power(e, -n-b), 2)).reshape(self.neurons, 1)))

фактическийcode

n = self.HIDDEN[self.layers]
b = self.bias[self.layers]
w = self.outputWeights

self.outputWeights = self.outputWeights - l * ( -numpy.divide((2 * (numpy.dot(y.reshape(self.outputs, 1), (1+numpy.power(e, -n-b))).reshape(self.neurons, self.outputs)-w)).reshape(self.outputs, self.neurons), (numpy.power(1+ numpy.power(e, -n-b), 2)).reshape(self.neurons, 1)))

Я ожидал, что из-за того, что столбцы первой матрицы и строки второй матрицы имеют одинаковый размер, у него не будет проблем.

1 Ответ

0 голосов
/ 19 апреля 2019

С матричным произведением, dot, правило: last dim of A pairs with 2nd to the last dim of B:

In [136]: x=np.arange(10).reshape(5,2); y=np.arange(2)[:,None]                       
In [137]: x.shape, y.shape                                                           
Out[137]: ((5, 2), (2, 1))
In [138]: x.dot(y)                                                                   
Out[138]: 
array([[1],
       [3],
       [5],
       [7],
       [9]])
In [139]: _.shape                                                                    
Out[139]: (5, 1)

Совпадение inner 2 и результат (5,1).

Но с поэлементными операциями, такими как * (умножение), деление и сумма, эти измерения не работают

In [140]: x*y                                                                        
---------------------------------------------------------------------------
ValueError: operands could not be broadcast together with shapes (5,2) (2,1)

Транспонирование y произведений:

In [141]: x*y.T                                                                      
Out[141]: 
array([[0, 1],
       [0, 3],
       [0, 5],
       [0, 7],
       [0, 9]])

Это потому, что y.T имеет форму (1,2). Посредством широковещательных правил, которые могут быть соединены с (5,2) для получения массива (5,2). Размер 1 можно расширить, чтобы соответствовать 5 из x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...