Обратное размножение с помощью NumPy делает вес NaN - PullRequest
0 голосов
/ 16 декабря 2018

по какой-то причине мой алгоритм backprop делает мои веса NaN, я понятия не имею почему.Не все время, кажется, тоже случайно.Я не знаю, что вызывает NaN, но было бы полезно, если бы кто-нибудь мог объяснить.Вот код для backprop:

def backpropagate(self, data, iters=1, learning_rate=0.001):
        inputs = [_set[0] for _set in data]
        outputs = [_set[1] for _set in data]
        for i in range(iters):
            for j in range(len(inputs)):
                output = outputs[j]
                input = inputs[j]
                expected = self.feed_forward(input)  # expected output
                state = self.feed_full(input)
                error = output - expected  # error
                delta = error * self.activation_function(expected, True)
                self.weights[len(self.weights) - 1] += np.transpose(state[len(self.weights)]).dot(delta) * learning_rate
                for weight_layer in reversed(range(len(self.weights))):
                    i = weight_layer
                    error = delta.dot(self.weights[i].T)  # updating error
                    delta = error * self.activation_function(state[i], True)  # updating delta for each weight
                    self.weights[i] += np.transpose(state[i]).dot(delta) * learning_rate

Вот простая прямая передача для всех состояний сети:

def feed_full(self, x):
    state = x
    activations = [x]
    for weight_layer in self.weights:
        state = self.activation_function(np.dot(state, weight_layer))
        activations.append(state)
    return activations

Вот основной файл:

data = [[[1, 2], 3],
        [[2, 2], 4],
        [[3, 2], 5],
        [[1, 1], 2],
        [[0, 2], 2]]

input_set = [_set[0] for _set in data]

nn = NeuralNetwork([2, 1], linear)
print(nn.feed_forward(input_set))
nn.print_net()
nn.backpropagate(data, 10000)
nn.print_net()
print(nn.feed_forward(input_set))

Я должен упомянуть, что функция активации является классом, здесь:

class ActivationFunction:
    def __init__(self, func, deriv):
        self.func = func
        self.deriv = deriv

    def __call__(self, x, deriv=False):
        if not deriv:
            return self.func(x)
        return self.deriv(x)

также здесь - журнал ошибок и ошибок для некоторых итераций, когда форма сети равна [2, 30,1].Выполнение 10000 итераций:

Delta: [-1.25834964e+20]
Error: [-5.39488342e+132]
Delta: [-5.39488342e+132]
Error: [-inf]
Delta: [-inf]
Error: [-inf]
Delta: [-inf]
Error: [nan]
Delta: [nan]
Error: [nan]
Delta: [nan]

Все функции активации работают нормально, но я продолжаю получать NaN.Любая помощь приветствуется, спасибо за ваше время.

...