关于Pytorch中permute(transpose)与view的区别
首先,这两者是不能混淆也很容易混淆的,而混淆后代码其实是能跑通的,但结果肯定有差异,这就很恶心。
rpn_locs = rpn_locs.permute(0, 2, 3, 1).contiguous().view(n, -1, 4)
上面代码,在Faster-RCNN里,需要把rpn网络的一个输出,从batch_size*channel*height*weight的形式,变成batch_size*?*4的形式,如果直接用view去改变维度的话,则会混淆维度之间的信息,可以参考https://blog.csdn.net/weixin_41712499/article/details/108753170
举个例子:
a = torch.randn(4, 3, 32, 32) a1 = a.transpose(1, 3).contiguous().view(4, 3*32*32).view(4, 32, 32, 3).transpose(1,3) tensor([[[[True, True, True, ..., True, True, True], [True, True, True, ..., True, True, True], [True, True, True, ..., True, True, True], ..., [True, True, True, ..., True, True, True], [True, True, True, ..., True, True, True], [True, True, True, ..., True, True, True]], ......
这样能完全恢复数据维度信息,而
a.transpose(1, 3).contiguous().view(4, 3*32*32).view(4, 3, 32, 32)
则不能恢复
人生苦短,何不用python