pytorch中对于tensor的一些骚操作

25 篇文章 278 订阅
1 篇文章 2 订阅

使用环境:pytorch1.3.1;python3.6

最近在读pytorch官方实现的Faster RCNN代码时,发现了一些非常规的tensor操作,为了方便理解,在此记录下:

1. (a[:, None] * b[None, :]).view(-1)

这是在计算anchor的k值出现的操作,其中a为一维向量[a1, a2, ..., an],b也为一维向量[b1, b2, ..., bm]。a[:, None]目的是增加一个新维度shape从[n] -> [n, 1],同理b[None, :]的shape从[m] -> [1, m]。接着两个矩阵相乘shape从[n, 1] * [1, m] -> [n, m] ,最后通过view(-1)展开成一维[n, m] -> [nm]。通俗的说,假设面积尺度有n个,高宽比例因子有m个,那么就能够组合成n * m个不同的矩形框(anchor)。

 

2. (a.view(-1, 1, 4) + b.view(1, -1, 4)).reshape(-1, 4)

这是将所有anchor绘制到原图上的出现的操作,a为二维向量shape为[n, 4],b也为二维向量shape为[m, 4],view和reshape的功能是类似的,a.view(-1, 1, 4)操作后shape[m, 4] -> [m, 1, 4],b.view(1, -1, 4)操作后shape[n, 4] -> [1, n, 4],接下来的相加就是一波骚操作了,按常理来讲两个维度不同的矩阵是不能相加的,但torch的tensor是可以的,a.view(-1, 1, 4)+b.view(1, -1, 4)后的shape是[m, n, 4],如下图所示(我个人理解的相加过程),假设shape代表维度(x, y, z),m=2, n=3, 首先我们对a进行view后得到我们图中的Tensor(a) shape[2, 1, 4]可以理解x方向两个单位,y方向一个单位,z方向4个单位。接着我们对b进行view得到我们图中的Tensor(b) shape[1, 3, 4]可以理解x方向一个单位,y方向三个单位,z方向4个单位。为了Tensor(a)和Tensor(b)能够相加,Tensor(a)在y方向复制了m=3次,Tensor(b)在x方向复制了n=2次,这样就得到了相同维度的两个Tensor shape[2, 3, 4],这样就可以愉快的相加了。最后在reshape一下得到tensor的shape为[m*n, 4]。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳花的小绿豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值