Вот ссылка на мой проект: https://github.com/aaronnoyes/neural-network/blob/master/nn.py
Я реализовал базовую нейронную сеть в Python.По умолчанию он использует функцию активации сигмоида, и это прекрасно работает.Я пытаюсь сравнить изменения в скорости обучения между функциями активации, поэтому я попытался реализовать опцию для использования ReLU.Однако когда он запускается, все веса сразу падают до 0.
if (self.activation == 'relu'):
d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * self.relu(self.output, True)))
d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * self.relu(self.output, True), self.weights2.T) * self.relu(self.layer1, True)))
Я почти уверен, что проблема в строках 54-56 моей программы (показанной выше), когда я пытаюсь применить градиентный спуск.Как я могу это исправить, чтобы программа действительно обновляла веса соответствующим образом?Моя реальная реализация выглядит следующим образом:
def relu(self, x, derivative=False):
if derivative:
return 1. * (x > 0)
else:
return x * (x > 0)