使用(Nx1)矩阵和长度为N

时间:2018-04-25 18:23:06

标签: python numpy

我正试图用这一行更新神经网络中的权重:

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时的问题。

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)

在您的情况下,ab分别为self.l1weights[0]self.learning_rate * l1error