Я пытался создать свой собственный сценарий обратного распространения в python. Я пытался взять производную от сигмовидной функции, чтобы обновить свои веса, но я нашел проблему, которую не могу решить. Форма весов (2, 2)
, форма X (входная форма) - (4, 2)
, а матрица, которую я получаю из предыдущего слоя после обратного распространения, имеет форму (2, 4)
или (4, 2)
(зависит от того, как я использую точку, но я не думаю это очень полезная информация). Производная сигмоида по x имеет вид:
sigmoid(x) * (1 - sigmoid(x))
Чтобы получить градиент веса, мне нужно умножить X * sigmoid_derivative(last_derivative)
. И проблема в следующем: Если форма ввода равна (4, 2)
, мне нужно переместить ее и умножить на другую матрицу с формой (4, 2)
, чтобы получить градиент, но я не могу, потому что если я сделаю np.dot(sigmoid(x), 1 - sigmoid(x))
, то это вернем матрицу с количеством строк, равным количеству столбцов. Что мне делать? (Например, допустим, что sigmoid(x)
даст мне матрицу (2, 4)
. Затем я умножу ее на матрицу (4, 2)
(транспонированная (2, 4)
) и получу (2, 2)
матрица, которая не позволяет мне брать).
Это код, который я использую для обратного распространения:
def backward(self, last_derivative, lr):
w = self.weights
derivative = self.derivative_sigmoid(last_derivative)
d_w = np.dot(dloss_1, self.layer_input)
self.weights -= np.dot(lr, d_w)
return np.dot(w, dloss_1.T)
Также self.derivative_sigmoid
равен
self.sigmoid = lambda x: np.divide(1, (1 + np.exp(-x)))
self.derivative_sigmoid = lambda x: np.dot(self.sigmoid(x), (1 - sigmoid(x)))
Изменить: Яцек Ройек решил мою проблему с этим. Вместо этого я должен использовать np.multiply()
или просто *
.