Нейронная сеть возвращает неверный ответ - PullRequest
0 голосов
/ 07 февраля 2020

Я пишу нейронную сеть в 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)```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...