我正试图用这一行更新神经网络中的权重:
self.l1weights[0] = self.l1weights[0] + self.learning_rate * l1error
这会导致值错误:
ValueError: could not broadcast input array from shape (7,7) into shape (7)
打印learning_rate *错误,权重返回如下:
[[-0.00657573]
[-0.01430752]
[-0.01739463]
[-0.00038115]
[-0.01563393]
[-0.02060908]
[-0.01559269]]
[ 4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01
1.46755891e-01 9.23385948e-02 1.86260211e-01]
很明显,在这个例子中权重被初始化为长度为7的向量,并且误差被初始化为7×1矩阵。我希望add也会返回一个7x1矩阵或一个向量,但它生成一个像这样的7x7矩阵:
[[ 4.10446271e-01 7.13748760e-01 -6.46135890e-03 2.95756839e-01
1.40180157e-01 8.57628611e-02 1.79684478e-01]
[ 4.02714481e-01 7.06016970e-01 -1.41931487e-02 2.88025049e-01
1.32448367e-01 7.80310713e-02 1.71952688e-01]
[ 3.99627379e-01 7.02929868e-01 -1.72802505e-02 2.84937947e-01
1.29361266e-01 7.49439695e-02 1.68865586e-01]
[ 4.16640855e-01 7.19943343e-01 -2.66775370e-04 3.01951422e-01
1.46374741e-01 9.19574446e-02 1.85879061e-01]
[ 4.01388075e-01 7.04690564e-01 -1.55195551e-02 2.86698643e-01
1.31121961e-01 7.67046648e-02 1.70626281e-01]
[ 3.96412924e-01 6.99715412e-01 -2.04947062e-02 2.81723492e-01
1.26146810e-01 7.17295137e-02 1.65651130e-01]
[ 4.01429313e-01 7.04731801e-01 -1.54783174e-02 2.86739880e-01
1.31163199e-01 7.67459026e-02 1.70667519e-01]]
Numpy.sum也返回相同的7x7矩阵。有没有办法在没有明确重塑的情况下解决这个问题?输出大小是可变的,这是特定于输出大小为1时的问题。
答案 0 :(得分:2)
当添加(7,)数组(名为a
)与(1,7)数组(名为b
)时,广播发生并生成(7,7)数组。如果您只想逐个元素添加,请将它们保持相同的形状
a + b.flatten()
给出(7,)。 flatten
使所有维度合并为一个维度。这会将结果保持为一行
a.reshape(-1, 1) + b
给出(1,7)。 -1
中的reshape
需要numpy
来确定给定其他维度的元素数量。这会将结果保留为列。
a = np.arange(7) # row
b = a.reshape(-1, 1) # column
print((a + b).shape) # (7, 7)
print((a + b.flatten()).shape) # (7,)
print((a.reshape(-1, 1) + b).shape) # (7, 1)
在您的情况下,a
和b
分别为self.l1weights[0]
和self.learning_rate * l1error
。