Python tf.expand_dims对向量的具体作用是什么?为什么即使矩阵形状不同,结果也可以相加?
我将两个我认为被“重塑”的向量相加,得到一个2d矩阵。我预计这里会出现某种类型的错误,但没有得到它。我想我知道发生了什么,它把它们当作水平和垂直方向上还有两组向量,但我不明白为什么a和b的结果没有不同。如果他们不是命中注定的,为什么这一切都会起作用呢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_
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
。