【译】Effective TensorFlow Chapter4——TensorFlow中的Broadcast机制的优缺点

栏目: 编程工具 · 发布时间: 5年前

内容简介:本文翻译自:TensorFlow 支持广播元素操作。 通常,当你想做加法或乘法的运算时,你需要确保操作数的形状(shape)是匹配的,例如:你不能将一个形状为[3, 2]的张量和一个形状为[3,4]的张量相加。但是,这里有一个特殊情况,那就是当你的其中一个操作数是一个具有单独维度(广播机制允许我们在隐式情况下进行填充(

本文翻译自: 《Broadcasting the good and the ugly》 , 如有侵权请联系删除,仅限于学术交流,请勿商用。如有谬误,请联系指出。

TensorFlow 支持广播元素操作。 通常,当你想做加法或乘法的运算时,你需要确保操作数的形状(shape)是匹配的,例如:你不能将一个形状为[3, 2]的张量和一个形状为[3,4]的张量相加。但是,这里有一个特殊情况,那就是当你的其中一个操作数是一个具有单独维度( singular dimension )的张量的时候,TF会隐式地在它的单独维度方向填满( tile ),以确保和另一个操作数的形状相匹配。所以,对一个[3,2]的张量和一个[3,1]的张量相加在TF中是合法的。

import tensorflow as tf

a = tf.constant([[1., 2.], [3., 4.]])
b = tf.constant([[1.], [2.]])
# c = a + tf.tile(b, [1, 2])
c = a + b

广播机制允许我们在隐式情况下进行填充( tile ),这种操作可以使得我们的代码更加简洁,并且更有效率地利用内存,因为我们不需要储存填充操作的结果。一个可以表现这个优势的应用场景就是在结合具有不同长度的特征向量的时候。为了拼接具有不同长度的特征向量,我们一般都先填充输入向量,拼接这个结果然后进行之后的一系列非线性操作等。这是各种神经网络架构的常见模式::

a = tf.random_uniform([5, 3, 5])
b = tf.random_uniform([5, 1, 6])

# concat a and b and apply nonlinearity
tiled_b = tf.tile(b, [1, 3, 1])
c = tf.concat([a, tiled_b], 2)
d = tf.layers.dense(c, 10, activation=tf.nn.relu)

但如果利用了广播机制,这种操作就可以更有效地完成。举个例子,因为我们知道$f(m(x+y))=f(mx+my)$的事实,所以我们可以分别进行线性操作,并使用广播进行隐式连接:

pa = tf.layers.dense(a, 10, activation=None)
pb = tf.layers.dense(b, 10, activation=None)
d = tf.nn.relu(pa + pb)

事实上,这段代码是通用的,只要张量之间能够进行广播,就可以应用于任意形状的张量:

def merge(a, b, units, activation=tf.nn.relu):
    pa = tf.layers.dense(a, units, activation=None)
    pb = tf.layers.dense(b, units, activation=None)
    c = pa + pb
    if activation is not None:
        c = activation(c)
    return c

一个更通用的函数在

目前为止,我们讨论了广播机制的优点,但是同样的广播机制也有其缺点,隐式假设几乎总是使得调试变得更加困难,考虑下面的例子:

a = tf.constant([[1.], [2.]])
b = tf.constant([1., 2.])
c = tf.reduce_sum(a + b)

你猜这个结果是多少?如果你说是6,那么你就错了,答案应该是12。这是因为当两个张量的 不匹配的时候,TensorFlow将会在元素操作之前自动展开 较低的张量的第一维,所以这个加法的结果将会变为[[2, 3], [3, 4]],对所有参数进行约化后得到12。

解决这种麻烦的方法就是尽可能地显示使用。我们在需要reduce某些张量的时候,显式地指定维度,然后寻找这个bug就会变得简单:

a = tf.constant([[1.], [2.]])
b = tf.constant([1., 2.])
c = tf.reduce_sum(a + b, 0)

这样,c的值就是[5, 7],我们就容易猜到其出错的原因。一个更通用的法则就是:在进行reduce操作和使用 tf.squeeze 时我们必须指定维度。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

重新定义团队:谷歌如何工作

重新定义团队:谷歌如何工作

拉兹洛·博克 / 宋伟 / 中信出版集团 / 2015-12-1 / CNY 56.00

谷歌首席人才官拉斯洛•博克权威力作,谷歌公开认可的谷歌高层作品,首度揭秘谷歌颠覆工业时代模式的人才和团队管理的核心法则,《纽约时报》畅销榜第一名,Business Insider 2015最佳商业书籍,谷歌的创造力就在于此! 编辑推荐! 1、 谷歌人才官首次公开谷歌人才和团队管理的核心秘籍 在谷歌执掌人事多年的拉斯洛•博克是人才和团队管理的顶级专家。他加入谷歌后,谷歌的员工数从六......一起来看看 《重新定义团队:谷歌如何工作》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具