Я написал нейронную сеть на 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]