Во время обратного распространения получение ValueError: операнды не могут быть переданы вместе с формами (1,3) (1,4) - PullRequest
0 голосов
/ 16 мая 2019

Я создал нейронную сеть с одним скрытым слоем с 3 узлами, в качестве функции активации использовалась сигмовидная функция

Входной слой (2 узла):
X | X - матрица с размером (1x2)

Скрытый слой (3 узла):
W1 => будет иметь размер (3x2)
Z1 = X. (W1.T) + b
A1 = σ (Z) | (W1.T) - транспонирование матрицы W

Выходной слой (4 узла):
W2 => будет иметь размер (4x3)
Z2 = A1. (W2.T) + b
A2 = σ (Z)
E = 0,5 * (Y-A2) ^ 2 | Y - матрица с размером (1x4)

Я хотел рассчитать, как W скрытого слоя влияет на E (функцию стоимости), применяя правило цепочки

dEdW1 = dEdA2 * dA2dZ2 * dZ2dA1 * dA1dZ1 * dZ1dW1
= (A2-Y) * (σ (Z2) * (1-σ (Z2))) * W2.T * (σ (Z1) * (1-σ (Z1)))) * X
размеры матрицы => (1x4) * (1x4) * (3x4) * (1x3) * (1x2)

Я знаю, что что-то не так с моими производными, так как я не могу умножить матрицы (они бывают разных размеров), может кто-нибудь указать, как это исправить
Вот реализация:

образец-нейронная сеть

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Переключите свои весовые матрицы.Предположим следующее: Для входной матрицы X размеров 4х2 (то есть у вас есть 4 входа, то есть строки), а каждый вход имеет размерность 2 элемента), например:

[[0,0], [0, 1], [1, 0], [1, 1]]

Если в вашем скрытом слое 4 нейрона, ваша матрица веса w0 оказывается размером 2x4.У вас будет вектор смещения b0 из 4 элементов, и после расчета активации на этом слое вы получите:

z1 = X @ w0 + b0  # 4x2 * 2x4 + 1x4 = 4x4
a1 = f(z1)  # 4x4

Тогда, скажем, в выходном слое у вас есть 2 элемента, которые делают вашматрица w1 размера 4x2 и ваш вектор b1 размера 2. Выполнение математики дает:

z2 = a1 @ w1 + b1  # 4x4 * 4x2 + 1x2 = 4x2
a2  = f(z)  # 4x2

Во время обратного распространения вы вычисляете дельту для каждого слоя как:

d_O = (Y - T) * f'(z2)
d_H = d_O @ W1.T * f'(z1)

, где Y -Предположение вашей сети о размере: 4x2

T - метки обучения, поэтому они должны совпадать: 4x2

Умножение - это поэлементное умножение, которое делает ваше

d_O размера 4x2

Расчет размера дельты скрытого слоя очень похож:

d_O: 4x2

W1 имеет размер 4x2, поэтому транспонироватьравно 2x4, при этом @ является стандартным матричным умножением, ваше измерение d_H получается следующим образом:

d_H размера 4x4

Для обновления ваших весов у вас есть:

dW1 := a1.T @ d_O
dW2 := X.T @ d_H

, где a1 - матрица 4x4, d_O -матрица 4x2, которая делает ваш dW1 матрицей 4x2.W1 был размером 4x2.

X - ваша входная матрица размера 4x2, XT - 2x4, а d_H - 4x4, что делает dW0 2x4.Ваш оригинальный W0 был 2x4.

Смещения дельты намного проще:

db1 = np.sum(d_O, axis=0)
db0 = np.sum(d_H, axis=0)
0 голосов
/ 16 мая 2019

Вы, вероятно, должны транспонировать свои матрицы.

Умножение матриц работает как «AxB * BxC = AxC», поэтому вы не сможете умножить (1x4) * (3x4). Попробуйте переставить второе, и вы получите умножение (1x4) * (4x3).

А также изменить порядок остальных, чтобы он выглядел следующим образом (4x1) (1x4) (4x3) (3x1) (1x2)

...