为什么形状不对齐?
Why aren't shapes aligned?
我一直在试验基本的神经网络,我在网上找到了一些 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")
X 的形状是 (3,6) 所以 l0 的形状是相同的,syn0 的形状是 (3,4)。
所以在第 22 行 np.(dot0,syn0)
他们已经无法成为点并提出一个 ValueError
表示形状不对齐。
你应该转置 l0 使其形状变成 (6,3) 然后它们就可以不是。
读取numpy dot doc,当使用numpy.dot(a, b, out=None)
the last axis of a and the second-to-last of b
需要equal.Then可以矩阵乘法
我一直在试验基本的神经网络,我在网上找到了一些 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")
X 的形状是 (3,6) 所以 l0 的形状是相同的,syn0 的形状是 (3,4)。
所以在第 22 行 np.(dot0,syn0)
他们已经无法成为点并提出一个 ValueError
表示形状不对齐。
你应该转置 l0 使其形状变成 (6,3) 然后它们就可以不是。
读取numpy dot doc,当使用numpy.dot(a, b, out=None)
the last axis of a and the second-to-last of b
需要equal.Then可以矩阵乘法