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函数即可,代码很简单,不再给出。

tensor的维度扩张的手段--Broadcasting的更多相关文章

  1. Pytorch 中 tensor的维度拼接

    torch.stack() 和 torch.cat() 都可以按照指定的维度进行拼接,但是两者也有区别,torch.satck() 是增加新的维度进行堆叠,即其维度拼接后会增加一个维度:而torch. ...

  2. pytorch 调整tensor的维度位置

    target.permute([0, 3, 1, 2]) 一定要使用permute以及中括号 一些在我这里没起到作用的网上的例子: 1. https://blog.csdn.net/zouxiaolv ...

  3. [TensorFlow]Tensor维度理解

    http://wossoneri.github.io/2017/11/15/[Tensorflow]The-dimension-of-Tensor/ Tensor维度理解 Tensor在Tensorf ...

  4. tensorflow中tensor的静态维度和动态维度

    tf中使用张量(tensor)这种数据结构来表示所有的数据,可以把张量看成是一个具有n个维度的数组或列表,张量会在各个节点之间流动,参与计算. 张量具有静态维度和动态维度. 在图构建过程中定义的张量拥 ...

  5. tensor维度变换

    维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一. 在详解维度变换的方法之前,这里先介绍一下View(视图)的概念.所谓Vi ...

  6. Pytorch Tensor 维度的扩充和压缩

    维度扩展 x.unsqueeze(n) 在 n 号位置添加一个维度 例子: import torch x = torch.rand(3,2) x1 = x.unsqueeze(0) # 在第一维的位置 ...

  7. Pytorch-tensor的维度变化

    引言 本篇介绍tensor的维度变化. 维度变化改变的是数据的理解方式! view/reshape:大小不变的条件下,转变shape squeeze/unsqueeze:减少/增加维度 transpo ...

  8. pytorch张量数据索引切片与维度变换操作大全(非常全)

    (1-1)pytorch张量数据的索引与切片操作1.对于张量数据的索引操作主要有以下几种方式:a=torch.rand(4,3,28,28):DIM=4的张量数据a(1)a[:2]:取第一个维度的前2 ...

  9. Pytorch | 详解Pytorch科学计算包——Tensor

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Pytorch专题的第二篇,我们继续来了解一下Pytorch中Tensor的用法. 上一篇文章当中我们简单介绍了一下如何创建一个Ten ...

随机推荐

  1. Codeforces_842

    A.枚举一个区间,判断是否有数符合. #include<bits/stdc++.h> using namespace std; long long l,r,x,y,k; int main( ...

  2. 一口气说出 9种 分布式ID生成方式,面试官有点懵了

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 本文作者:程序员内点事 原文链接:https://mp.weix ...

  3. 上周 GitHub 热点速览 vol.07:GitHub 官方 CLI beta 版已发布

    摘要:GitHub Trending 上周看点,GitHub 官宣 CLI 已发布 beta 版,前端新晋高性能打包神器 esbuild 宣战 Webpack&Parcel,微软.Facebo ...

  4. num07---工厂方法模式

    一.简单工厂模式 [之所以叫简单,说明没有完全做到 设计模式的要求] 前言:活字印刷术,面向对象思想 复用 维护 扩展 灵活 高内聚低耦合 以 实现 一个计算器 为例: 1.创建 抽象类count, ...

  5. 安装Mysql时提示尚未安装Python 解决方案

    我明明安装了python,结果在安装mysql是却提示没有安装python. 原因,没有将python添加到path中. 解决方法:卸载python,然后重装python,在安装界面中勾选将path添 ...

  6. redis命令总结与持久化

    上篇redis文章为大家介绍了redis与它的部署工作.这次我们来说一下redis的操作命令与持久化 一.命令总结 1)String操作 6379> set k1 v1 #设定值 6379> ...

  7. python学习(1)python的基本概念

    1.python是世界上最流行的程序语言之一,用途广泛. 2.python是解释型语言,与C++编译类语言相比,python扩展性强,简单易上手.但是缺点也很明显,执行速度慢. 3.python定义中 ...

  8. kali重置root密码

    像这样,kali系统的root密码忘记了,只需一分钟时间,快速重置root密码 第一步: 电脑开机后kali系统会进入引导界面,这是我们只需 “e” 进入启动前编辑命令(若系统没有出现这个页面,大家在 ...

  9. php面试笔记(5)-php基础知识-自定义函数及内部函数考点

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点 ...

  10. linux 删除文件 磁盘空间未释放

    具体情况就是:删除了一个超大文件后,发现磁盘空间没有变化 原因:有进程正在使用这个文件,虽然我们从文件系统的目录结构上解除链接(unlink),然而文件是被 打开的(有一个进程正在使用),那么进程将仍 ...