首页 > 解决方案 > tf.expand_dims 到底对向量做了什么?为什么即使矩阵形状不同,结果也可以相加?

问题描述

我将两个我认为是“重塑”的向量相加在一起,结果得到了一个二维矩阵。我预计这里会出现某种类型的错误,但没有得到它。我想我明白发生了什么,它把它们当作水平和垂直方向的每个向量还有两组,但我不明白为什么 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]]

标签: pythonpython-3.xtensorflowmatrixaddition

解决方案


其实这个题更多的利用了tensorflow的广播特性,和numpy(广播)一样。Broadcasting摆脱了张量之间的运算形状必须相同的要求。当然,它还必须满足一定的条件。

一般广播规则:

当对两个数组进行操作时,NumPy 会逐元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时

1.他们是平等的,或者

2.其中一个是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()插入一个维度。axis您的原始数据形状是(3,). 你会得到你的集合时a=tf.expand_dims(start_vec, 0)的形状。你会得到你的集合时的形状。(1,3)axis=0b=tf.expand_dims(start_vec, 1)(3,1)axis=1

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

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

推荐阅读