broadcasting是tensorflow中tensor维度扩张的最常用的手段,指对某一个维度上重复N多次,虽然它呈现数据已被扩张,但不会复制数据。

可以这样理解,对 [b,784]@[784,10]+[10]这样一个操作([10]可以理解为偏置项),那么原式可以化为[b,10]+[10],但是[b,10]和[10]这两个tensor是不能直接相加的,两者必须化为相一致维度的单元才能相加,即,把[10]扩张为[b,10],两者才能相加,而broadcasting做的就是这样一件事。

如果上面的说法仍然不好理解,我们再换一个说法,对于两个tensor,tensor1:[4,16,16,32](4维)和tensor2:[32](1维),我们将两个不同维度的张量右对齐即4-null,16-null,16-null,32-32,然后从右往前,即从小维度往大维度延伸,如果tensor2在相应的维度上没有维度,我们就插入一个维度,即,从[32]变为[1,1,1,32],然后把插入的维度扩张成相同的size,即把[1,1,1,32]扩张为[4,16,16,32]

又如,对tensor[4,32,32,3],要给它加一个偏置项b:[3],那么这个b的扩张过程为[3]→[1,1,1,3]→[4,32,32,3]

又如,现有两个tensor,tensor1:[4,1],tensor2:[1,3],两个tensor相加,则变化为,[4,1]→[4,3],[1,3]→[4,3]

又如,现有两个tensor,tensor1:[4],tensor2:[1,3],两个tensor不能相加,因为我们扩张时遵循的是右对齐原则,即[4]将要变成[1,4],而[1,4]和[1,3]是不能相加的

那么broadcasting有什么实际意义呢?

举个实际例子,对于[classes,students,scores]这样一个tensor概念(前文已经提过),由于期末考试某科难度提高,我们需要提高它的基准分,因此我们构建一个偏置项[scores],让它与前者相加,这时候通过broadcasting我们就可以让高维元素普适我们的[scores]操作(因为单纯的[scores]是没有学生和班级这样的概念的,通过broadcasting可以看成是对这种概念的补充),即,给所有班级的所有学生的成绩都加上这样的一个偏置。

开头我们提到broadcasting可以实现数据的维度扩张但不会复制数据,意思是,对于[b,10]+[10]这样一个操作,虽然经过broadcasting我们将[10]理解为了一个[b,10](扩张),但其实际的数据shape仍然是[10],如果不使用broadcasting而是用我们前面提到过的维度变换的方法,过程是这个样子的:首先使用expand方法在axis=0的地方插入一个维度使其变为[1,10],然后使用tf.tile方法对[1,10]复制b次,使其变为[b,10],经过这样一个数据变换后,原来的偏置就真的变成了shape为[b,10]的tensor。对比之下可以看到,如果不指定高维度的配置,只给定低维度的概念那么broadcasting默认会进行高维的适配和扩张,而且broadcasting使用更加的简洁,同时可以节省大量的存储空间(因为并没有复制数据)。

使用方法只需要调用tf.broadcast_to函数即可,代码很简单,不再给出。

最新文章

  1. P1220 关路灯
  2. 【leetcode】Repeated DNA Sequences(middle)★
  3. Mac OS X使用快捷键改善窗口管理的六个方法
  4. jenkins忘记管理员登陆密码的补救措施
  5. ASP.NET网页验证码常用方法
  6. hdu 2578 Dating with girls(1)
  7. minicom 配置
  8. 【笔记】mongodb启动不了:child process failed, exited with error number 100
  9. div没有设置高度时背景颜色不显示(浮动)
  10. android获取系统版本号
  11. 自定义MVC框架(二) -基于XML文件
  12. ios-贝塞尔曲线
  13. Java发布一个简单 webservice应用 并发送SOAP请求
  14. Big Data Solution in Azure: Azure Data Lake
  15. GCD多线程的一个全面的题目
  16. java基础 -- 经典排序
  17. 2018-05-14 代码考古-Python3官方教程字典例程
  18. C#保存文件为无BOM的utf8格式
  19. Thrift IDL
  20. exec和sp_executesql

热门文章

  1. HDU_3415_单调队列
  2. WARNING OGG-00706 Failed to add supplemental log group on table
  3. Redis5.x五种数据类型常见命令
  4. ELF文件之七——使用链接脚本-2个函数-data-bss-temp-call
  5. k8s系列----索引
  6. python制作ico图标
  7. linux系统初装
  8. 聊聊GIS数据的四个分层与GIS服务
  9. MySQL中的执行计划explain
  10. JAVA 增删改查接口命名规范(dao层与 service 层