Я пишу нейронную сеть в python3, она должна найти строки и столбцы в 3x3 частях изображения, но она возвращает неправильный ответ (около 0,4 вместо 0,8 или 0,2), и я не знаю почему (я думаю, что проблема в fix_errors
функции, но я не очень уверен). Пожалуйста, помогите мне решить эту проблему. Вот мой код:
class neural_net(object):
from math import exp
from random import random
def __init__(self,layers,**kwargs):
self.layers = layers
if "activation_function" in kwargs:
self.activation_function = kwargs["activation_function"]
else:
self.activation_function = "self.activate_neuron"
if "weights" in kwargs:
self.weights = kwargs["weights"]
else:
self.weights = []
for i in range(len(layers)-1):
self.weights.append([])
for j in range(layers[i]):
self.weights[i].append([])
for k in range(layers[i+1]):
self.weights[i][j].append(self.random()-0.5)
self.neurons = []
for i in range(len(layers)):
self.neurons.append([])
for j in range(layers[i]):
self.neurons[i].append({})
self.neurons[i][j]["neuron_data"] = 0
self.neurons[i][j]["error"] = 0
def activate_neuron(self,number):
number = 1/( 1 + self.exp( -1 * number ))
return number
def find_errors(self,comparative_data):
for i in range(len(self.neurons)):
for j in range(len(self.neurons[i])):
self.neurons[i][j]["error"] = 0
for i in range(len(comparative_data)):
self.neurons[-1][i]["error"] = comparative_data[i] - self.neurons[-1][i]["neuron_data"]
for i in range(len(self.weights)-1,-1,-1):
for j in range(len(self.weights[i])):
for k in range(len(self.weights[i][j])):
self.neurons[i][j]["error"] += self.neurons[i+1][k]["error"] * self.weights[i][j][k]
for k in range(len(self.weights[i][j])):
self.neurons[i][j]["error"] *= self.neurons[i+1][k]["neuron_data"] * (1 - self.neurons[i+1][k]["neuron_data"])
def fix_errors(self,training_k):
for i in range(len(self.weights)):
for j in range(len(self.weights[i])):
for k in range(len(self.weights[i][j])):
#self.weights[i][j][k] += training_k * self.neurons[i][j]["neuron_data"] * self.neurons[i+1][k]["error"] * self.neurons[i][j]["neuron_data"] * (1 - self.neurons[i][j]["neuron_data"])
self.weights[i][j][k] += training_k * self.neurons[i+1][k]["error"] * self.neurons[i][j]["neuron_data"]
#self.weights[i][j][k] += training_k * self.neurons[i+1][k]["error"] * self.neurons[i][j]["neuron_data"] * self.neurons[i+1][k]["neuron_data"] * (1 - self.neurons[i+1][k]["neuron_data"])
def run(self,in_data):
for i in range(len(self.neurons)):
for j in range(len(self.neurons[i])):
self.neurons[i][j]["neuron_data"] = 0
for i in range(len(in_data)):
self.neurons[0][i]["neuron_data"] = in_data[i]
for i in range(len(self.weights)):
for j in range(len(self.weights[i])):
for k in range(len(self.weights[i][j])):
self.neurons[i+1][k]["neuron_data"] += self.neurons[i][j]["neuron_data"] * self.weights[i][j][k]
for j in range(len(self.neurons[i+1])):
self.neurons[i+1][j]["neuron_data"] = eval(self.activation_function)(self.neurons[i+1][j]["neuron_data"])
out_data = []
for i in self.neurons[-1]:
out_data.append(i["neuron_data"])
return out_data
arr = [
[[0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2],[0.2,0.2]],
[[0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8],[0.2,0.2]],
[[0.8,0.8,0.8,0.2,0.2,0.2,0.2,0.2,0.2],[0.8,0.2]],
[[0.2,0.2,0.2,0.8,0.8,0.8,0.2,0.2,0.2],[0.8,0.2]],
[[0.2,0.2,0.2,0.2,0.2,0.2,0.8,0.8,0.8],[0.8,0.2]],
[[0.8,0.2,0.2,0.8,0.2,0.2,0.8,0.2,0.2],[0.2,0.8]],
[[0.2,0.8,0.2,0.2,0.8,0.2,0.2,0.8,0.2],[0.2,0.8]],
[[0.2,0.2,0.8,0.2,0.2,0.8,0.2,0.2,0.8],[0.2,0.8]],
[[0.8,0.8,0.8,0.8,0.2,0.2,0.8,0.2,0.2],[0.8,0.8]],
[[0.8,0.2,0.2,0.8,0.8,0.8,0.8,0.2,0.2],[0.8,0.8]],
[[0.8,0.2,0.2,0.8,0.2,0.2,0.8,0.8,0.8],[0.8,0.8]],
[[0.8,0.8,0.8,0.2,0.8,0.2,0.2,0.8,0.2],[0.8,0.8]],
[[0.2,0.8,0.2,0.8,0.8,0.8,0.2,0.8,0.2],[0.8,0.8]],
[[0.2,0.8,0.2,0.2,0.8,0.2,0.8,0.8,0.8],[0.8,0.8]],
[[0.8,0.8,0.8,0.2,0.2,0.8,0.2,0.2,0.8],[0.8,0.8]],
[[0.2,0.2,0.8,0.8,0.8,0.8,0.2,0.2,0.8],[0.8,0.8]],
[[0.2,0.2,0.8,0.2,0.2,0.8,0.8,0.8,0.8],[0.8,0.8]],
]
import random
nn1 = neural_net([9,4,3,2])
for i in range(10000):
a = random.choice(arr)
print("--{0}--".format(i+1))
for j in range(3):
for k in range(3):
print(int(a[0][j*3+k]+0.2),end=' ')
print()
print(int(a[1][0]+0.2),int(a[1][1]+0.2)," - ",nn1.run(a[0]))
nn1.find_errors(a[1])
nn1.fix_errors(0.1)```