關於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)

則不能恢復


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM