Моделирование обратного распространения - PullRequest
0 голосов
/ 19 апреля 2020

Я разрабатываю MLP, используя 1 скрытый нейрон и 1 выходной нейрон. Когда я запускаю его для базы данных, содержащей только 1 входную переменную, он работает нормально. Однако, когда я запускаю его для базы данных, содержащей 2 входные переменные, я получаю ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-cb57c241bc03> in <module>
      1 Model2=MLP_regular(1000,0.01)
----> 2 Model2.trainandtest()

<ipython-input-16-403adbf2fc53> in trainandtest(self)
     24             for xi, saida in zip(train_inputs, train_targets):
---> 25                 pred=self.forward(xi)
     26                 erro = saida - pred
     27                 derro_dw2 = erro * dsigmoid(self.s2)

<ipython-input-16-403adbf2fc53> in forward(self, x)
     12         self.z1 = np.dot(x,self.w1)
     13         self.s1 = sigmoid(self.z1+self.beta1)
---> 14         self.z2 = np.dot(self.s1,self.w2)
     15         self.s2 = sigmoid(self.z2+self.beta2)
     16         return self.s2

ValueError: shapes (1,) and (2,) not aligned: 1 (dim 0) != 2 (dim 0)

Для меня это не имеет смысла, потому что форма self.w2 должна быть равна 1. Как можно я решаю это?

Это мой код, где train_inputs представляет собой массив со строками, содержащими значения двух входных переменных:

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def dsigmoid(x):
    z = sigmoid(x)
    return z * (1 - z)

np.random.seed(0)
class MLP_regular:
    def __init__(self,epocas,lrn_rate):
        self.lrn_rate = lrn_rate
        self.epocas = epocas
        self.w1 = np.random.rand(n_inputs)
        self.beta1 = np.zeros(1)
        self.w2 = np.random.rand(1)
        self.beta2 = np.zeros(1)

    def forward(self,x):
        self.z1 = np.dot(x,self.w1)
        self.s1 = sigmoid(self.z1+self.beta1)
        self.z2 = np.dot(self.s1,self.w2)
        self.s2 = sigmoid(self.z2+self.beta2)
        return self.s2

    def trainandtest(self):
        self.error=[]
        for _ in range(self.epocas):
            for xi, saida in zip(train_inputs, train_targets):
                pred=self.forward(xi)
                erro = saida - pred
                derro_dw2 = erro * dsigmoid(self.s2)
                derro_dw1 = erro * dsigmoid(self.s2) * self.w2 * (1-self.s1) * self.s1
                incremento1 = -self.lrn_rate * derro_dw2
                incremento2 = -self.lrn_rate * derro_dw1
                self.w1 = self.w1 + incremento1 * self.s1
                self.beta1 = self.beta1 + incremento1
                self.w2 = self.w2 + incremento2 * xi
                self.beta2 = self.beta2 + incremento2
            self.y_pred=[]
            for xi, saida in zip(test_inputs, test_targets):
                pr=self.forward(xi)
                self.y_pred.append(pr)
            mse_error=mean_squared_error(test_targets, self.y_pred)
            self.error.append(mse_error)

Model2=MLP_regular(1000,0.01)
Model2.trainandtest()

1 Ответ

0 голосов
/ 19 апреля 2020

Проблема решена. Мне просто нужно было использовать np.dot(x.T,self.w1) вместо np.dot(x,self.w1).

...