Обучение нейронной сети на 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


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