Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tf.expand_dims对向量的具体作用是什么?为什么即使矩阵形状不同,结果也可以相加?_Python_Python 3.x_Tensorflow_Matrix_Addition - Fatal编程技术网

Python tf.expand_dims对向量的具体作用是什么?为什么即使矩阵形状不同,结果也可以相加?

Python tf.expand_dims对向量的具体作用是什么?为什么即使矩阵形状不同,结果也可以相加?,python,python-3.x,tensorflow,matrix,addition,Python,Python 3.x,Tensorflow,Matrix,Addition,我将两个我认为被“重塑”的向量相加,得到一个2d矩阵。我预计这里会出现某种类型的错误,但没有得到它。我想我知道发生了什么,它把它们当作水平和垂直方向上还有两组向量,但我不明白为什么a和b的结果没有不同。如果他们不是命中注定的,为什么这一切都会起作用呢 import tensorflow as tf import numpy as np start_vec = np.array((83,69,45)) a = tf.expand_dims(start_vec, 0) b = tf.expand_

我将两个我认为被“重塑”的向量相加,得到一个2d矩阵。我预计这里会出现某种类型的错误,但没有得到它。我想我知道发生了什么,它把它们当作水平和垂直方向上还有两组向量,但我不明白为什么a和b的结果没有不同。如果他们不是命中注定的,为什么这一切都会起作用呢

import tensorflow as tf
import numpy as np

start_vec = np.array((83,69,45))
a = tf.expand_dims(start_vec, 0)
b = tf.expand_dims(start_vec, 1)
ab_sum = a + b
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    a = sess.run(a)
    b = sess.run(b)
    ab_sum = sess.run(ab_sum)

print(a)
print(b)
print(ab_sum)
=================================================

[[83 69 45]]

[[83]
 [69]
 [45]]

[[166 152 128]
 [152 138 114]
 [128 114  90]]

事实上,这个问题更多地利用了tensorflow的广播特性, 与numpy()相同<代码>广播摆脱了张量之间的运算形状必须相同的要求。当然,它也必须满足某些条件

一般广播规则:

在两个阵列上操作时,NumPy 按元素比较它们的形状。它从尾随开始 尺寸,并努力前进。两个维度是兼容的 什么时候

1.他们是平等的,或

其中一个是1

一个简单的例子是一维张量乘以标量

import tensorflow as tf

start_vec = tf.constant((83,69,45))
b = start_vec * 2

with tf.Session() as sess:
    print(sess.run(b))

[166 138  90]
回到问题上来,
tf.expand_dims()
的功能是在指定的
位置向张量形状插入尺寸。您的原始数据形状是
(3,)
。当你的集合轴=0时,你会得到a=tf的形状。当你的集合轴=1时,你会得到b=tf的形状。当你的集合轴=1时,你会得到b=tf的形状。当你的集合轴=1时,你会得到a=tf的形状

通过比较
广播的规则
,您可以看到它们满足第二个条件。所以他们的实际操作是

83,83,83     83,69,45
69,69,69  +  83,69,45
45,45,45     83,69,45

嘿@giser_yugang,自从问了这个问题后,我一直在玩TensorFlow,我注册了你上面提到的两条广播规则。但前几天,我需要乘以两个张量元素,形状[20,50,36,42]和[20,50]。我将第二个参数重塑为[20,50,1,1],然后使用tf.broadcast_将其广播到[20,50,36,42],以便将其相乘。但事实证明,对于你提到的第二条规则(其中一条是1),我认为任何数字都可以是1。bc如果我将[20,50,36,42]乘以[20,50,1,1],它仍然给出相同的结果。@jp88
其中一个是1
表示两个矩阵的维数比较,而不是在同一个矩阵中只有
1
<在您的示例中,
36
1
有一个
1
42
1
有一个
1