Как исправить ошибку 'ValueError: формы (1,3) и (1,1) не выровнены: 3 (dim 1)! = 1 (dim 0)' в numpy - PullRequest
1 голос
/ 14 апреля 2019

В настоящее время я учусь кодировать нейронные сети в numpy / python. Я использовал код из этого урока и попытался адаптировать его для создания импортируемого модуля. Тем не менее, когда я попытался использовать свой собственный набор данных. Выкинул ошибку numey ValueError: shapes (1,3) and (1,1) not aligned: 3 (dim 1) != 1 (dim 0).

Я уже пытался изменить все матрицы с (x,) на (x, 1), но безуспешно. После небольшого прочтения транспонирование массивов также должно было решить проблему, но я тоже это попробовал, но и безуспешно.

Вот модуль (называемый hidden_net):

import numpy as np
class network:
    def __init__(self,layer_num,learning_rate=0.7,seed=None,logistic_coefficent=0.9):
        self.logistic_coefficent=logistic_coefficent
        self.learning_rate=learning_rate
        self.w0 = np.random.random((layer_num[0],layer_num[1]))
        self.w1 = np.random.random((layer_num[1],layer_num[2]))

        np.random.seed(seed)
    def sigmoid(self,x,reverse=False):
            if(reverse==True):
                return x*(1-x)
            return 1/(1+np.exp(-x*self.logistic_coefficent))

    def train(self,inps,outs):
        inps=np.array(inps)
        layer0 = inps
        layer1 = self.sigmoid(np.dot(layer0,self.w0))
        layer2 = self.sigmoid(np.dot(layer1,self.w1))
        layer2_error = outs - layer2
        layer2_delta = layer2_error*self.sigmoid(layer2,reverse=True)#*self.learning_rate
        layer1_error = layer2_delta.dot(self.w1.T)
        layer1_delta = layer1_error * self.sigmoid(layer1,reverse=True)#*self.learning_rate

        layer1= np.reshape(layer1, (layer1.shape[0], 1))
        layer2= np.reshape(layer2, (layer2.shape[0], 1))
        layer1_delta= np.reshape(layer1_delta, (layer1_delta.shape[0], 1))  #Other attempts to reshape to avoid this error
        layer2_delta= np.reshape(layer2_delta, (layer2_delta.shape[0], 1))

        self.w1 += layer1.T.dot(layer2_delta)
        self.w0 += layer0.T.dot(layer1_delta)

Вот программа, импортирующая этот модуль:

import hidden_net
op=open('Mall_Customers_Mod.txt','r')
full=op.read()
op.close()
full_lines=full.split('\n')
training_lines=[]
for i in range(174):
    training_lines.append(full_lines[0])
    del full_lines[0]
training_inputs=[]
training_outputs=[]
for j in training_lines:
    training_inputs.append([float(j.split(',')[0]),float(j.split(',')[1])])
    training_outputs.append(float(j.split(',')[2]))
testing_lines=full_lines
testing_inputs=[]
testing_outputs=[]
for l in testing_lines:
    testing_inputs.append([float(l.split(',')[0]),float(l.split(',')[1])])
    testing_outputs.append(float(l.split(',')[2]))
nn=hidden_net.network([2,3,1],seed=10)
for i in range(1000):
    for cur in range(len(training_inputs)):
        nn.train(training_inputs[cur],training_outputs[cur])

и вот часть моего набора данных (Mall_Customers_Mod.txt)

-1,19,15
-1,21,15
1,20,16
1,23,16
1,31,17
1,22,17
1,35,18
1,23,18
-1,64,19
1,30,19
-1,67,19
1,35,19
1,58,20
1,24,20
-1,37,20
-1,22,20
1,35,21
-1,20,21
-1,52,23

Ошибка в строке 30:

self.w1 += layer1.T.dot(layer2_delta)
ValueError: shapes (1,3) and (1,1) not aligned: 3 (dim 1) != 1 (dim 0)

Также извините, я знаю, что мне нужно избегать вставки целых файлов, но здесь это кажется довольно неизбежным

1 Ответ

1 голос
/ 14 апреля 2019

Неправильные строки ниже, layer0 - входной слой и не содержит нейронов.

self.w1 += layer1.T.dot(layer2_delta)
self.w0 += layer0.T.dot(layer1_delta)

Они должны быть:

self.w1 += layer2.T.dot(layer2_delta)
self.w0 += layer1.T.dot(layer1_delta)

Все операции по изменению формы также должны быть удалены. Обновленная функция train

def train(self,inps,outs):
    inps=np.array(inps)
    layer0 = inps
    layer1 = self.sigmoid(np.dot(layer0,self.w0))
    layer2 = self.sigmoid(np.dot(layer1,self.w1))
    layer2_error = outs - layer2
    layer2_delta = layer2_error*self.sigmoid(layer2,reverse=True)#*self.learning_rate
    layer1_error = layer2_delta.dot(self.w1.T)
    layer1_delta = layer1_error * self.sigmoid(layer1,reverse=True)#*self.learning_rate

    self.w1 += layer2.T.dot(layer2_delta)
    self.w0 += layer1.T.dot(layer1_delta)
...