再次使用PythonNumPy和数组在矩阵之间进行一些计算的过程中很辛苦。
可能不起作用的代码部分如下。
train,test,cv=NP.Array_split(data,3,axis=0) ) )。
train _ inputs=train [ :-1 ]
test _ inputs=test [ :-1 ]
cv _ inputs=cv [ :-1 ]
train_outputs=train[:-1]
test_outputs=test[:-1]
cv_outputs=cv[:-1]
打印这些矩阵信息(分别为np.ndim、np.shape和dtype )会得到什么?
2
1
2
1
2
1
(94936,30 )
(94936,)
(94936,30 )
(94936,)
(94935,30 )
(94935,)
浮动64
浮动64
浮动64
浮动64
浮动64
浮动64
我认为所有的*_output数组都缺少一维。
另一个所需的矩阵是通过以下命令创建的。
new matrix=neuron layer (30,94936 ) ) ) ) ) ) ) ) ) ) ) )。
其中neuronLayer定义的类:
类新闻层() :
def __init__(self,neurons,neuron_inputs ) :
self.weights=2* NP.random.random ((neuron _ inputs,neurons ) )- 1
这是最终的输出:
output layer1=self._ _ sigmoid (NP.dot ) inputs,self.layer1.weights ) )
value error : shapes (94936,30 ) and ) 94936,30 ) notaligned:30(dim1)!=94936(dim0)
Python明确地告诉我矩阵没有被加起来,但我不知道问题出在哪里。
有小费吗?
PS :将完整的代码粘贴到中。
解决方案
层1=neuron层(30,94936 ) # 29 neurons with 227908 inputs
层2=neuron层(1,30 ) #1neuronwiththeprevious 29 inputs
NueronLayer是在哪里创建的
self.weights=2* NP.random.random ((neuron _ inputs,neurons ) )- 1
两个权重的大小分别为[ 94936,30 ]和[ 30,1 ]。
这条线没有任何意义。 我很惊讶那个没有错
第1层error=第2层delta.dot (self.layer2. weights.NP.transpose ) )。
我怀疑你想要NP.transpose (self.layer2. weights )还是self.layer2.weights.T。
但是可能没有到那里。 train第一次给think (94936,30 ) inputs打电话
output layer1=self._ _ sigmoid (NP.dot ) inputs,self.layer1.weights ) )
output layer2=self._ _ sigmoid (NP.dot ) outputlayer1,self.layer2.weights )
因此,对np.dot2的两个(94936,30 ),94936,30 )序列尝试进行a运算。 那些和点不兼容。 可以互换生成(94936,94936 )数组或(30,30 )。 一个太大了。 (30,30 )与第二层重量兼容。
NP.dot(inputs.t,self.layer1.weights ) )。
有工作的机会。
NP.dot(outputlayer1,self.layer2.weights )。
(30,30 ) with (30,1 )=(30,1 ) ) ) ) )。
但是你呢
train_outputs - outputLayer2
无论train_outputs是(94936,)还是(94936,1 ),都有问题
在计算过程中必须确保数组的形状正确流动。 不要一开始就检查它们。 还有内部检查。 此外,您还需要了解每个步骤应该具有什么形状。
这个代码的开发和测试很容易用更少的输入和层,比如10个样本和3个功能。 这样可以显示值和形状。