Переключите свои весовые матрицы.Предположим следующее: Для входной матрицы 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)