Я написал нейронную сеть на Python, но я не уверен в правильности кода

Я написал нейронную сеть на Python, но я не уверен в правильности кода на некотрых примерах всё работает отлично, но на некотрых не особо. Мне бы знать правилен ли код чтобы я знал что брать за основу.

def activation(num):
    return 1/(1+2.7182818284590452353**-num)

def derivative(num):
    return num*(1-num)

class NeuralNetwork:
    def __init__(self,layers,neurons=None,weigher=[],activation=activation,derivative=derivative):
        if type(layers)!=list and type(layers)!=tuple:
            raise Exception("Layers should be list or tuple.")
        elif len(layers)<3:
            raise Exception("Need more layers.")
        self.layers=layers
        if neurons:
            if len(layers)>len(neurons):
                raise Exception("Need more displacement neuron lengths.")
        self.neurons=neurons and neurons or tuple([0]*len(layers))
        if self.neurons[-1]:
            self.neurons[-1]=0
        if weigher==[] or weigher==None:
            weigher=[]
            from random import random
            for i in range(len(layers)-1):
                weigher_layer=[]
                for j in range((layers[i]+self.neurons[i])*layers[i+1]):
                    weigher_layer.append(random())
                weigher.append(weigher_layer)
        self.weigher=tuple(weigher)
        self.activation=activation
        self.derivative=derivative
    def execute(self,input_data):
        layers=self.layers
        neurons=self.neurons
        weigher=self.weigher
        activation=self.activation
        if type(input_data)!=list and type(input_data)!=tuple or layers[0]!=len(input_data):
            raise Exception("Wrong input data!")
        for l in range(len(layers)-1):
            neuout=[]
            if neurons[l]:
                input_data.append(1)
            for j in range(layers[l+1]):
                sum=0
                for i in range(layers[l]):
                    sum+=weigher[l][i*layers[l+1]+j]*input_data[i]
                neuout.append(activation(sum))
            input_data=neuout
        return neuout
    def train(self,input_data,output_data,factor=0.1):
        layers=self.layers
        neurons=self.neurons
        weigher=self.weigher
        activation=self.activation
        derivative=self.derivative
        if type(input_data)!=list and type(input_data)!=tuple or layers[0]!=len(input_data):
            raise Exception("Wrong input data!")
        all_out=[input_data]
        for l in range(len(layers)-1):
            neuout=[]
            if neurons[l]:
                input_data.append(1)
            for j in range(layers[l+1]):
                sum=0
                for i in range(layers[l]):
                    sum+=weigher[l][i*layers[l+1]+j]*input_data[i]
                neuout.append(activation(sum))
            input_data=neuout
            all_out.append(neuout)
        all_out=tuple(all_out)
        l=len(layers)-1
        e=[]
        for o in range(len(output_data)):
            e.append(output_data[o]-neuout[o])
        errors=[e]
        while l>1:
            e=[]
            for i in range(layers[l-1]+neurons[l]):
                sum=0
                for j in range(layers[l]):
                    sum+=weigher[l-1][j+i*layers[l]]*errors[0][j]
                e.append(sum)
            errors.insert(0,e)
            l-=1
        errors=tuple(errors)
        for l in range(len(layers)-1):
            for i in range(layers[l]+neurons[l]):
                for j in range(layers[l+1]):
                    weigher[l][j+i*layers[l+1]]+=factor*errors[l][j]*derivative(all_out[l+1][j])*all_out[l][i] #Тут ещё вопрос, надо подавать в производную вход, выход нейрона или в зависимости от функции.
        self.weigher=weigher
        return errors[-1]

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