Некорректно работает нейронная сеть
Читаю книгу "Создаем нейронную сеть" от Тарика Рашида, повторяю код за автором и у меня нейросеть выдает совсем не те результаты, что получаются у автора. Также тестировал код автора, взятый с гитхаба, тоже работает некорректно. В чем может быть проблема? Свой код и ссылку на код автора прикладываю ниже
import numpy as np
import scipy.special
import matplotlib.pyplot as plt
class neuralNetwork:
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
self.inodes = inputnodes # кол-во узлов в входном слое
self.hnodes = hiddennodes # кол-во узлов в скрытом слое
self.onodes = outputnodes # кол-во узлов в выходном слое
self.lr = learningrate
self.wih = np.random.normal(0.0, self.inodes ** -0.5, (self.hnodes, self.inodes)) # матрица весовых коэффициентов связей (между входным и скрытым слоями)
self.who = np.random.normal(0.0, self.hnodes ** -0.5, (self.onodes, self.hnodes)) # матрица весовых коэффициентов между скрытым и выходным слоями
self.activation_func = lambda x: scipy.special.expit(x)
def train(self, inputs_list, targets_list):
inputs = np.array(inputs_list, ndmin=2).T
targets = np.array(targets_list, ndmin=2).T
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = self.activation_func(hidden_inputs)
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = self.activation_func(final_inputs)
outputs_errors = targets - final_outputs
hidden_errors = np.dot(self.who.T, outputs_errors)
self.who += self.lr * np.dot(outputs_errors * final_outputs * (1 - final_outputs), hidden_outputs.T)
self.wih += self.lr * np.dot(hidden_errors * hidden_outputs * (1 - hidden_outputs), inputs.T)
def query(self, inputs_list):
inputs = np.array(inputs_list, ndmin=2).T
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = self.activation_func(hidden_inputs)
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = self.activation_func(final_inputs)
return final_outputs
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
some_neural = neuralNetwork(input_nodes, hidden_nodes, output_nodes, 0.3)
with open('mnist_test_10.csv', 'r') as data_file:
test_data = data_file.read().split('\n')[:-1]
scorecard = []
for record in test_data:
values = record.split(',')
correct_answer = int(values[0])
print(correct_answer, 'истинный ответ')
inputs = (np.asfarray(values[1:]) / 255.0 * 0.99) + 0.01
outputs = some_neural.query(inputs)
max_label = np.argmax(outputs)
print(max_label, 'ответ сети')
if max_label == correct_answer:
scorecard.append(1)
else:
scorecard.append(0)
#fig, axis = plt.subplots(figsize=(6, 6))
#axis.imshow(np.asfarray(values[1:]).reshape((28, 28)), cmap='Greys')