Исправление ошибки в коде
import numpy
# scipy.специально для функции sigmoid expit()
import scipy.special
# определение класса нейронной сети
class neuralNetwork:
# инициализация нейронной сети
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# установить количество узлов в каждом входном, скрытом, выходном слое
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# матрицы весов
self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
# коэфициэнт обучения
self.lr = learningrate
# функция активации - сигмоидная функция
self.activation_function = lambda x: scipy.special.expit(x)
pass
# тренировать нейронную сеть
def train(self, inputs_list, targets_list):
# преобразовать список входов в 2d массив
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
# вычисление входящие сигналы для скрытого слоя
hidden_inputs = numpy.dot(self.wih, inputs)
# рассчитать исходящие сигналы для скрытого слоя
hidden_outputs = self.activation_function(hidden_inputs)
# расчитать входящие сигналы для выходного слоя
final_inputs = numpy.dot(self.who, hidden_outputs)
# расчитать исход
final_outputs = self.activation_function(final_inputs)
# ошибка выходного слоя
output_errors = targets - final_outputs
# скрытая ошибка слоя
hidden_errors = numpy.dot(self.who.T, output_errors)
#обновить веса связей между скрытым и выходным слоями
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))
# обновить веса для связей между входными и скрытыми слоями
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))
pass
# запрос к нейронной сети
def query(self, inputs_list):
# преобразовать список входов в 2d массив
inputs = numpy.array(inputs_list, ndmin=2).T
# вычисление сигналов в скрытом слое
hidden_inputs = numpy.dot(self.wih, inputs)
#рассчитать сигналы, возникающие из скрытого слоя
hidden_outputs = self.activation_function(hidden_inputs)
# высчитайте сигналы в окончательный слой выхода
final_inputs = numpy.dot(self.who, hidden_outputs)
#вычисление сигналов, выходящих из конечного выходного слоя
final_outputs = self.activation_function(final_inputs)
return final_outputs
# количество входных, скрытых и выходных узлов
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
# скорость обучения
learning_rate = 0.1
# создать экземпляр нейронной сети
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
# загрузить CSV-файл данных обучения mnist в список
with open('mnist_train (1).csv', 'r') as file:
text = file.read()
print (text)
# тренировать нейронную сеть
# эпох, сколько раз обучающий набор данных используется для обучения
epochs = 5
for e in range(epochs):
# просмотр всех записей в наборе обучающих данных для записи в тексте:
for record in text:
# разделить запись запятыми
all_values = record.split(',')
# масштабирование и сдвиг входов
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
# создать целевые выходные значения (все 0.01, кроме желаемой метки 0.99)
targets = numpy.zeros(output_nodes) + 0.01
# all_values[0] является целевой меткой для этой записи
targets[int(all_values[0])] = 0.99
n.train(inputs, targets)
pass
pass
# загрузить файл CSV тестовых данных mnist в списокist
with open('mnist_test (1).csv', 'r') as file:
text1 = file.read()
print (text1)
# тестирование нейронной сети
# scorecard for how well the network performs, initially empty
scorecard = []
# просмотрите все записи в наборе тестовых данных для записи в тексте1:
for record in text1:
# разделить запись запятыми ','
all_values = record.split(',')
# правильный ответ-первое значение
correct_label = int(all_values[0])
# масштабирование и сдвиг входов
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
# запрос к сети
outputs = n.query(inputs)
# индекс наибольшего значения соответствует метке
label = numpy.argmax(outputs)
# добавить правильный или неправильный список
if (label == correct_label):
#ответ сети соответствует правильному ответу, оценочная ведомость.добавьте(1)
scorecard.append(1)
else:
# ответ Сети не соответствует правильному ответу, добавьте 0 в систему показателей оценочная ведомость.добавить(0)
scorecard.append(0)
pass
pass
# вычислить балл производительности, доля правильных
scorecard_array = numpy.asarray(scorecard)
print ("performance = ", scorecard_array.sum() / scorecard_array.size)