【译】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 时我们必须指定维度。


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

查看所有标签

猜你喜欢:

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

HTML5与CSS3基础教程(第7版)

HTML5与CSS3基础教程(第7版)

[美] Elizabeth Castro、[美] Bruce Hyslop / 望以文 / 人民邮电出版社 / 2013-1 / 59.00元

代表下一代网页编写技术的HTML5,为网页提供布局和格式的CSS3,这两者构成了Web开发的基石,也是Web程序员和设计师必须熟练掌握的最基本技能。 本书是风靡全球的HTML和CSS最佳入门教程的最新版,上一版单单英文版的销量就超过100万册,被翻译为十多种语言,并长期雄踞亚马逊书店计算机图书排行榜榜首。 最新的第7版秉承前一版直观、透彻、全面、循序渐进的讲授特色,仍然采用独特的双栏图......一起来看看 《HTML5与CSS3基础教程(第7版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

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

在线图片转Base64编码工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具