Почему формы не выровнены?
Я экспериментировал с базовыми нейронными сетями и нашел в Интернете некоторый код на Python. Однако, когда я пытаюсь добавить еще 2 скрытых слоя в сеть, я получаю сообщение об ошибке:
Файл "python", строка 30, в ValueError: формы (6,4) и (1,4) не выровнены: 4 (dim 1)!= 1
Может кто-нибудь объяснить, в чем проблема с этим? Мне нигде не удалось найти четкого объяснения. Спасибо!
Код:
import numpy as np
def nonlin(x,deriv=False):
if(deriv==True):
return x*(1-x)
return 1/(1+np.exp(-x))
X = np.array([[1,0,1],
[0,1,0],
[1,1,0],
[0,0,0],
[0,0,1],
[1,1,1]])
y = np.array([[1,1,0,1,0,1]]).T
np.random.seed(1)
syn0 = 2*np.random.random((3,4)) - 1
syn1 = 2*np.random.random((4,5)) - 1
syn2 = 2*np.random.random((5,4)) - 1
syn3 = 2*np.random.random((4,1)) - 1
for iter in range(100000):
l0 = X
l1 = nonlin(np.dot(l0,syn0))
l2 = nonlin(np.dot(l1,syn1))
l3 = nonlin(np.dot(l2,syn2))
l4 = nonlin(np.dot(l3,syn3))
l4_error = y - l4
l4_delta = l4_error*nonlin(l3,deriv=True)
l3_error = l4_delta.dot(syn3.T)
l3_delta = l3_error*nonlin(l3,deriv=True)
l2_error = l3_delta.dot(syn2.T)
l2_delta = l2_error*nonlin(l2,deriv=True)
l1_error = l2_delta.dot(syn1.T)
l1_delta = l1_error * nonlin(l1,deriv=True)
syn3 += l3.T.dot(l4_delta)
syn2 += l2.T.dot(l3_delta)
syn1 += l1.T.dot(l2_delta)
syn0 += l0.T.dot(l1_delta)
print("Neural network trained:")
while True:
l0 = np.array([[int(i) for i in input().split()]])
l1 = nonlin(np.dot(l0,syn0))
l2 = nonlin(np.dot(l1,syn1))
l3 = nonlin(np.dot(l2,syn2))
l4 = nonlin(np.dot(l3,syn3))
print("Output:")
if l4[0][0] > 0.5:
print("Yes")
else:
print("No")
1 ответ
Форма X равна (3,6), поэтому форма l0 такая же, а форма syn0 - (3,4).
Так в строке 22 np.(dot0,syn0)
они уже не могут быть точечными и поднять ValueError
который говорит, что форма не выравнивается.
Вы должны транспонировать l0 так, чтобы его форма стала (6,3), тогда они могут не быть.
Читайте NumPy DOC DOC, при использовании numpy.dot(a, b, out=None)
последняя ось а и предпоследняя из б
должны быть равны. Затем вы можете умножить матрицу