Могу ли я сделать матрицу сигмоидного возврата (n, m) вместо (n, n)? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытался создать свой собственный сценарий обратного распространения в 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() или просто *.

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