使用环境: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]。