繁体   English   中英

将形状为(2,)和(3,1)的向量相乘

[英]Multiply vectors with shape (2,) and (3, 1)

我有以下代码:

import numpy as np


def sigmoid(x):
    """
    Calculate sigmoid
    """
    return 1 / (1 + np.exp(-x))


x = np.array([0.5, 0.1, -0.2])
target = 0.6
learnrate = 0.5

weights_input_hidden = np.array([[0.5, -0.6],
                                 [0.1, -0.2],
                                 [0.1, 0.7]])

weights_hidden_output = np.array([0.1, -0.3])

## Forward pass
hidden_layer_input = np.dot(x, weights_input_hidden)
hidden_layer_output = sigmoid(hidden_layer_input)

output_layer_in = np.dot(hidden_layer_output, weights_hidden_output)
output = sigmoid(output_layer_in)

## Backwards pass
## TODO: Calculate error
error = target - output

# TODO: Calculate error gradient for output layer
del_err_output = error * output * (1 - output)
print("del_err_output", del_err_output)

# TODO: Calculate error gradient for hidden layer
del_err_hidden = np.dot(del_err_output, weights_hidden_output) * hidden_layer_output * (1 - hidden_layer_output)
print("del_err_hidden", del_err_hidden)
print("del_err_hidden.shape", del_err_hidden.shape)
print("x", x)
print("x.shape", x.shape)
print("x[:,None]")
print(x[:,None])
print("x[:,None].shape", x[:,None].shape)
print("del_err_hidden * x[:, None]")
print(del_err_hidden * x[:, None])

生成以下输出:

del_err_output 0.0287306695435
del_err_hidden [ 0.00070802 -0.00204471]
del_err_hidden.shape (2,)
x [ 0.5  0.1 -0.2]
x.shape (3,)
x[:,None]
[[ 0.5]
 [ 0.1]
 [-0.2]]
x[:,None].shape (3, 1)
del_err_hidden * x[:, None]
[[  3.54011093e-04  -1.02235701e-03]
 [  7.08022187e-05  -2.04471402e-04]
 [ -1.41604437e-04   4.08942805e-04]]

我的问题是这个操作: del_err_hidden * x[:, None]

*是哪种运算?

其次,如果del_err_hidden.shape为(2,)并且x[:,None].shape为(3,1),为什么我可以将它们相乘?

有人告诉我这与元素和广播有关,但是我不理解这些术语。 因为要进行元素乘法,所以两个矩阵都必须具有相同的大小,而这里没有。

*只是按元素的乘法。 广播是它起作用的原因。 简而言之,当您将大小为(3,1)的列(称为x乘以大小为(2,)的行(称为y )时,numpy将创建一个新的3X2数组,其中第一列为y[0]*x ,第二列是y[1]*x

何时以及如何发生的确切规则有些复杂。 有关详细信息,请参见文档

好的,我引用了文档中的广播规则

两种尺寸兼容
1)它们相等,或
2)其中之一是1

您有两个形状为(2, )(3, 1) (2, )数组。

arr1 (1D) shape :      2
arr2 (2D) shape :  3 x 1

#                      ^
#                      |    (c.f. rule-2)

In [24]: err              # shape (2,)
Out[24]: array([2, 4])

In [26]: x                # shape (3, 1)
Out[26]: 
array([[3],
       [4],
       [5]])

由于数组维度之一为1,因此会传递规则。 这些数组是可广播的,并且可以相乘。 下一部分将扩展 err所在的数组( 仅从概念上讲 )。

In [27]: err          # shape (3, 2)
Out[27]: 
array([[2, 4],
       [2, 4],
       [2, 4]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM