python - 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]]
解决方案
其实这个题更多的利用了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=0
b=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
推荐阅读
- r - 包内函数在缺少可见绑定时产生警告
- flutter - 将屏幕带到导航器的顶部
- react-native - 使用 toLocaleString() 时,React Native 不使用千位分隔符 (,) 格式化数字
- gradle - 如何在 Gradle 复制任务中仅复制顶级文件?
- java - 在 vscode 中修改源代码/webcontent 时自动将 .war 部署到 Tomcat
- css - 使用 Parcel 从 node_modules 导入 CSS
- vb.net - 如何修复错误 Convert.toInt(txtnum.Text)
- android - 有什么方法可以让我们从一个活动转到另一个活动的片段
- laravel-5.8 - 如何将复选框的值设置为 json
- c++ - Sorting in Map (Lexicographical Order)