tensorflow - TensorFlow 中的广播是视图还是副本?
问题描述
请澄清 Tensorflow 中的广播是否会在广播时分配新的内存缓冲区。
在 Tensorflow 文档Introduction to Tensors - Broadcasting中,有一句话说(强调补充):
大多数时候,广播既节省时间又节省空间,因为广播操作永远不会实现内存中扩展的张量
然而在另一句话中它说:
例如,与数学运算不同,broadcast_to 没有做任何特别的事情来节省内存。在这里,您正在物化张量。
print(tf.broadcast_to(tf.constant([1, 2, 3]), [3, 3]))
tf.broadcast_to表示这是一个广播操作。
广播一个兼容形状的数组。
那么根据上面的“广播操作从不物化内存中扩展张量”的说法,它不应该物化。
请帮助澄清文件实际上在说什么。
解决方案
它说,由于时间和空间效率,通常广播操作永远不会在内存中实现扩展张量。
x = tf.constant([1, 2, 3])
y = tf.constant(2)
print(x * y)
tf.Tensor([2 4 6], shape=(3,), dtype=int32)
但是如果我们想看看它在广播后的样子,那么我们tf.broadcast_to
当然需要使用哪个来实现张量。
x = tf.constant([1, 2, 3, 4])
y = tf.broadcast_to(x, [3, 4])
print(y)
tf.Tensor(
[[1 2 3 4]
[1 2 3 4]
[1 2 3 4]], shape=(3, 4), dtype=int32)
根据文档
在进行广播操作(例如将张量乘以标量)时,广播(通常)会带来一些时间或空间优势,因为广播的张量永远不会物化。
但是,broadcast_to 并没有带来任何这样的好处。新创建的张量完全记忆广播的形状。(在图上下文中,broadcast_to 可能会融合到后续操作,然后被优化掉。)
推荐阅读
- css - React Material ui appbar 做出响应
- javascript - 如何显示实数而不是符号?(使用浮点数作为数据类型)
- facebook - Branch.io React Native 跟踪广告活动信息
- machine-learning - 逻辑损失和交叉熵损失的区别
- python - 为什么递归会出现这个超时错误?(Python)
- python - `id` 的内存优化
- javascript - 如何使用 jQuery 和 CSS 使侧边栏菜单和子菜单突出显示 onClick
- reactjs - 如何在 componentdidMount 之后再次渲染应用程序屏幕
- kubernetes - Airflow 1.10.7 中的 KubernetesPodOperator
- r - 为什么数据会这样表达?