Я разрабатываю 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()