Обучение нейронной сети на python
Вообщем-то проблема состоит в обучении, сколько бы я не читал гайдов или книг, я всё ни как не могу реализовать обучение нейронной сети, вот вариант на котором я остановился, но и то не могу его нормально сделать, просьба помочь:
locErr = 2
while locErr > 0:
self.countOut(inputs)
locErr = (2*(testOutp - self.outp))
smth = np.dot(locErr,deriv(self.outp))
d_w1 = np.dot(self.layers[2].output,(smth))
d_w2 = np.dot(self.layers[1].output,(np.dot(smth,self.layers[2].weights) * deriv(self.layers[2].output)))
d_w3 = np.dot(self.layers[0].output,(np.dot(smth,self.layers[1].weights) * deriv(self.layers[1].output)))
self.layers[2].weights = self.layers[2].weights + d_w1
# В строке ниже была ошибка
self.layers[1].weights = self.layers[1].weights + d_w2
self.layers[0].weights = self.layers[0].weights + d_w3
Вот ошибка:
ValueError: operands could not be broadcast together with shapes (2,5) (2,)
Вот сама нейронная сеть:
import random
def sigm(x):
return 1/(1+np.exp(-x))
def deriv(x):
return sigm(x)*(1-sigm(x))
class LayerD:
def __init__(self,n_inp,n_neurons):
self.weights = 0.10 * np.random.randn(n_inp,n_neurons)
#self.biases = np.zeros((1,n_neurons))
def forward(self,inp):
self.output = sigm(np.dot(inp,self.weights)) #+ self.biases
class Kurisa:
def __init__(self):
self.layers = np.array([LayerD(4,5),LayerD(5,5),LayerD(5,2)])
def countOut(self,inputs):
self.layers[0].forward(inputs)
self.layers[1].forward(self.layers[0].output)
self.layers[2].forward(self.layers[1].output)
self.outp = self.layers[2].output
return self.layers[2].output
def learn(self,testOutp,inputs):
locErr = 2
while locErr > 0:
self.countOut(inputs)
locErr = (2*(testOutp - self.outp))
smth = np.dot(locErr,deriv(self.outp))
d_w1 = np.dot(self.layers[2].output,(smth))
d_w2 = np.dot(self.layers[1].output,(np.dot(smth,self.layers[2].weights) * deriv(self.layers[2].output)))
d_w3 = np.dot(self.layers[0].output,(np.dot(smth,self.layers[1].weights) * deriv(self.layers[1].output)))
self.layers[2].weights = self.layers[2].weights + d_w1
self.layers[1].weights = self.layers[1].weights + d_w2
self.layers[0].weights = self.layers[0].weights + d_w3