Нейросеть стремится к значению 0.5 а не е 1

Я только начинаю изучать нейросети и значение выходного нейрона стремится к 0.5. Тут 2 нейрона в входном, 2 в скрытом и 1 в выходном.

Нейросеть делал по этой статье https://habr.com/ru/post/313216

import math
from random import uniform
from time import sleep

ideal = 1

neurons = [[1, 1], 
           [0, 0], 
           [0]]

weights = [ #layer neuron weight
       [[1, 1],
        [1, 1]],

       [[1],
        [1]]
    ]

biases = [ #layer weight
        [0, 0],
        [0]
    ]
    

deltas = [[0, 0],
          [0, 0],
          [0]]


DELTAS = [   #слой    нейрон    Δ

    [[0, 0],  #Δ 1 слоя 1 нейрона
     [0, 0]], #Δ 1 слоя 2 нейрона

    [[0], 
    [0]]]      #Δ 2 слоя 1 нейрона




def train():


    print("Error:", get_loss(), "Output:", neurons[-1][0], "Weights:", weights)
    print()
    print()
   
    for layer in range(len(deltas)-1, -1, -1):
        for neuron in range(len(neurons[layer])):
            if (layer == len(weights)):
                delta_output(neuron)
            elif (layer != 0): 
                delta_hidden(layer, neuron)

            if (layer != len(weights)):
                for weight_neuron in range(len(weights[layer][0])):
                    set_neurons()
                    DELTA = get_Δ(layer, neuron, weight_neuron)
                
                    weights[layer][neuron][weight_neuron] += DELTA






def get_loss():
    return (ideal - neurons[-1][0] ) ** 2


def set_neurons():
    for layer in range(1, len(neurons)):
        for neuron in range(len(neurons[layer])):
            for weight_neuron in range(len(weights[layer-1][0])):

                neurons[layer][neuron] = sigmoid(  weights[layer-1][weight_neuron][neuron] * neurons[layer-1][weight_neuron] + biases[layer-1][weight_neuron]  )


def delta_output(neuron_id):
    global ideal
    

    
    neuron_activate = neurons[-1][neuron_id]

    delta = (ideal - neuron_activate)  *  ((1 - neuron_activate) * neuron_activate)

    
    #сейвим дельту
    deltas[-1][neuron_id] = delta

    return delta


def delta_hidden(layer_of_neuron, neuron_id):
    sigma = 0
    
    for i in range(len(weights[layer_of_neuron][neuron_id])):
        sigma += weights[layer_of_neuron][neuron_id][i] * deltas[layer_of_neuron+1][i]
            
    neuron_activate = neurons[layer_of_neuron][neuron_id]
    delta = ((ideal - neuron_activate) * neuron_activate) * sigma
    
    #сейвим дельту
    deltas[layer_of_neuron][neuron_id] = delta


    return delta


def get_Δ(layer, neuron_id, weight_id):
    GRAD = deltas[layer+1][weight_id] * neurons[layer][neuron_id]
    
    
    E = 0.7
    a = 0.3 + 1
    
    Δ = E * GRAD + a * DELTAS[layer][neuron_id][weight_id]
    
    #сейвим Δ
    DELTAS[layer][neuron_id][weight_id] = Δ

    return Δ


def sigmoid(x):
    return 1/(1 + math.e ** x)



while True:
    train()

Ответы (0 шт):