python 与 pytorch(tensorflow) 的 broadcast 机制

Broadcast 是python 中很重要的一种机制,尤其是深度学习兴起之后,其被广泛运用于CNN网络结构中。 下面我们介绍一下 Broadcast 机制。

Broadcast 的核心原则有三条:

  1. 从最小的维度进行匹配(最后一个维度)
  2. 如果当前维数为1, 扩充至相同维数
  3. 如果当前没有维数,先增加一维,再扩充至相同维数

我们通过几个具体的例子来解释上面3条准则。我们以一个BCHW(样本个数,通道数,每个图像的高,每个图像的宽)格式的数据为例:

python 中的 Broadcast

若我们想要对一个训练集中采取一个平移操作:

准则3

a 是 由100 张3通道,像素为32*24 图片组成的数组, b 是对每个图片想要进行的平移操作(准则3

    

若我们想要对图片的颜色进行操作(准则3

若我们想要对颜色和像素同时操作(准则3

准则2

回到只对图片的像素操作

import numpy as np
a = np.random.rand(100, 3, 32, 24)
b3 = np.random.rand(16, 12)
(a + b3).shape

返回结果 

怎么会出错了呢? 16*2=32, 12*2 =24, 之后按照准则三增加维数,再进行扩充,应该没有什么问题。

原因在于违背了准则二:

从这样一个角度来理解: 给定一个2维数据和1维数据,如果他们能够相加, 我们希望1维数据没有的那些维度,他们的特性是一样的,也就是说他们相加的值是一样的。比方说

我们希望得到broadcast 之后的b 为

之后与a相加。 这样做的问题在于 b 新增的维度对应的向量为[2,1,2,1], 也就是说我们新增的维度有一个非均匀的先验假设,这显示是不符合实际的, 从这一点我们便可以看出准则2的必要性。

准则1 

如果我们想对通道进行变换, 从程序中便可以看出准则1的必要性.

a = np.random.rand(100, 3, 32, 24)
b = np.random.rand(3)  # 错: 违背了准则2
c = np.random.rand(3, 1, 1) # 对

tensorflow,pytorch 中的 Broadcast

只需将上面的 numpy 换成tensorflow,torch 即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值