Ошибка в обучении нейронной сети

Рейтинг: 0Ответов: 1Опубликовано: 06.02.2023

Скопировал с сайта: https://machinelearningmastery.ru/implement-backpropagation-algorithm-scratch-python/ код и поменял значения датасета ну и соответственно количество входных данных. Ошибка возникает только при тренировке нейронной сети!

from math import exp
from random import seed
from random import random

def initialize_network(n_inputs, n_hidden, n_outputs):
    network = list()
    hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
    network.append(hidden_layer)
    output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
    network.append(output_layer)
    return network

def activate(weights, inputs):
    activation = weights[-1]
    for i in range(len(weights)-1):
        activation += weights[i] * inputs[i]
    return activation

def transfer(activation):
    return 1.0 / (1.0 + exp(-activation))

def forward_propagate(network, row):
    inputs = row
    for layer in network:
        new_inputs = []
        for neuron in layer:
            activation = activate(neuron['weights'], inputs)
            neuron['output'] = transfer(activation)
            new_inputs.append(neuron['output'])
        inputs = new_inputs
    return inputs

def transfer_derivative(output):
    return output * (1.0 - output)

def backward_propagate_error(network, expected):
    for i in reversed(range(len(network))):
        layer = network[i]
        errors = list()
        if i != len(network)-1:
            for j in range(len(layer)):
                error = 0.0
                for neuron in network[i + 1]:
                    error += (neuron['weights'][j] * neuron['delta'])
                errors.append(error)
        else:
            for j in range(len(layer)):
                neuron = layer[j]
                errors.append(expected[j] - neuron['output'])
        for j in range(len(layer)):
            neuron = layer[j]
            neuron['delta'] = errors[j] * transfer_derivative(neuron['output'])

def update_weights(network, row, l_rate):
    for i in range(len(network)):
        inputs = row[:-1]
        if i != 0:
            inputs = [neuron['output'] for neuron in network[i - 1]]
        for neuron in network[i]:
            for j in range(len(inputs)):
                neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j]
            neuron['weights'][-1] += l_rate * neuron['delta']

def train_network(network, train, l_rate, n_epoch, n_outputs):
    for epoch in range(n_epoch):
        sum_error = 0
        for row in train:
            outputs = forward_propagate(network, row)
            expected = [0 for i in range(n_outputs)]
            expected[row[-1]] = 1
            sum_error += sum([(expected[i]-outputs[i])**2 for i in range(len(expected))])
            backward_propagate_error(network, expected)
            update_weights(network, row, l_rate)
        print('>epoch=%d, lrate=%.1f, error=%.10f' % (epoch, l_rate, sum_error), end='\r')

def predict(network, row):
    outputs = forward_propagate(network, row)
    return outputs.index(max(outputs))

def add_layer(network, n_hidden):
    hidden_layer = [{'weights':[random() for i in range(len(network))]} for i in range(n_hidden)]
    network.insert(0, hidden_layer)

dataset = [[1, 0, 0, 1],
        [1, 1, 0, 1],
        [1, 0, 0, 1],
        [0, 1, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 1, 0],
        [0, 1, 1, 0]]

network = initialize_network(3, 2, 2)

#add_layer(network, 2)

train_network(network, dataset, 0.5, 20000, 3)

print(predict(network, [0, 1, 0]))

Когда я запускаю этот код возникает ошибка:

  File "/home/michazaxm1205/Python/neyro/neyro.py", line 96, in <module>
    train_network(network, dataset, 0.5, 20000, 3)
  File "/home/michazaxm1205/Python/neyro/neyro.py", line 71, in train_network
    sum_error += sum([(expected[i]-outputs[i])**2 for i in range(len(expected))])
  File "/home/michazaxm1205/Python/neyro/neyro.py", line 71, in <listcomp>
    sum_error += sum([(expected[i]-outputs[i])**2 for i in range(len(expected))])
IndexError: list index out of range

Ответы

▲ 0Принят
network = initialize_network(3, 2, 2)
                                  ^^^

train_network(network, dataset, 0.5, 20000, 3)
                                           ^^^

В обеих функциях последний параметр это n_outputs. Вы уж определитесь, у вас n_outputs чему равно - 2 или 3. Не факт, что это единственная ошибка, но нужно всё-таки знать свои данные сколько там чего у вас.

Вот не зря там, откуда вы это скопировали, для задания этого и других значений использовались переменные, а не "магические числа". Использование переменных часто помогает "согласовать" данные, вместо чтобы угадывать "вручную" где какую циферку нужно написать, чтобы ошибки не было.