当前位置: 首页>C语言>正文

Pytorch中contiguous()函數理解

Pytorch中contiguous()函數理解

引言

在pytorch中,只有很少幾個操作是不改變tensor的內容本身,而只是重新定義下標與元素的對應關系的。換句話說,這種操作不進行數據拷貝和數據的改變,變的是元數據

會改變元數據的操作是:

  • narrow()
  • view()
  • expand()
  • transpose()?

在使用transpose()進行轉置操作時,pytorch并不會創建新的、轉置后的tensor,而是修改了tensor中的一些屬性(也就是元數據),使得此時的offset和stride是與轉置tensor相對應的。轉置的tensor和原tensor的內存是共享的!??

transpose()后改變元數據,代碼示例:?

x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1)
print("修改前:")
print("x-", x)
print("y-", y)print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)

?運行結果:

修改前:
x- tensor([[-0.5670, -1.0277],[ 0.1981, -1.2250],[ 0.8494, -1.4234]])
y- tensor([[-0.5670,  0.1981,  0.8494],[-1.0277, -1.2250, -1.4234]])修改后:
x- tensor([[11.0000, -1.0277],[ 0.1981, -1.2250],[ 0.8494, -1.4234]])
y- tensor([[11.0000,  0.1981,  0.8494],[-1.0277, -1.2250, -1.4234]])

可以看到,改變了y的元素的值的同時,x的元素的值也發生了變化

因此可以說,x是contiguous的,但y不是(因為內部數據不是通常的布局方式)。注意不要被contiguous的字面意思“連續的”誤解,tensor中數據還是在內存中一塊區域里,只是布局的問題!

為什么這么說:因為,y里面數據布局的方式和從頭開始創建一個常規的tensor布局的方式是不一樣的。這個可能只是python中之前常用的淺拷貝y還是指向x變量所處的位置,只是說記錄了transpose這個變化的布局。


使用contiguous()?

如果想要斷開這兩個變量之間的依賴(x本身是contiguous的),就要使用contiguous()針對x進行變化感覺上就是我們認為的深拷貝

?當調用contiguous()時會強制拷貝一份tensor,讓它的布局和從頭創建的一模一樣,但是兩個tensor完全沒有聯系

?代碼示例:

x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1).contiguous()
print("修改前:")
print("x-", x)
print("y-", y)print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)

運行結果:?

修改前:
x- tensor([[ 0.9730,  0.8559],[ 1.6064,  1.4375],[-1.0905,  1.0690]])
y- tensor([[ 0.9730,  1.6064, -1.0905],[ 0.8559,  1.4375,  1.0690]])修改后:
x- tensor([[ 0.9730,  0.8559],[ 1.6064,  1.4375],[-1.0905,  1.0690]])
y- tensor([[11.0000,  1.6064, -1.0905],[ 0.8559,  1.4375,  1.0690]])

?可以看到,當對y使用了.contiguous()后,改變y的值時,x沒有任何影響


后記?

?一般來說這一點不用太擔心,當遇到需要調用contiguous()的地方,運行時會提示你:

RuntimeError: input is not contiguous

?這時候只需要在該變量后面加上.contiguous()就可以了!


參考資料:

https://blog.csdn.net/gdymind/article/details/82662502

https://www.jianshu.com/p/7e72cc1ab7a0

https://www.zydui.com/af408UG8CDQ9VAF8G.html
>

相关文章:

  • 詳解PyTorch中的contiguous
  • PyTorch中的contiguous解讀
  • Pytorch中contiguous()函數理解
  • ios自定義UITabBar-仿寫掌上英雄聯盟的UITabBar
  • 基于Cocos2d-x的英雄聯盟皮膚選擇菜單
  • lol-登陸英雄聯盟出錯
  • JS中雙層for循環執行順序
  • 關于for循環執行順序
  • 上古卷軸5boss計算機丟失,上古卷軸5常見BUG解決辦法
  • 上古世紀服務器維護真情禮,4月9日例行維護懷舊服合服公告
  • 塔羅牌張數
  • 工程管理中的工程技術
  • 銳派出品:LOL新年特輯S4各類細節之下路篇
  • 藍城兄弟Q4業績背后,垂直社區具備多少想象力?
  • Mac OS啟動服務優化高級篇(launchd tuning)
  • #Geek Point# 為什么現在要去印度看一看?
  • vm 流程運行mac os_什么是“商務”流程,為什么在我的Mac上運行?
  • # 陌生人社交產品:需求、困境與破局之道
  • mac 不受信任在哪里更改_什么是受信任的,為什么它可以在Mac上運行?
  • 車行軌跡分類實踐
  • 智慧車行預約小程序 v9.1
  • i12藍牙耳機充電倉怎么看充滿電_車行藍牙耳機價格高性價比的選擇
  • 車行平安
  • 論文閱讀——《基于卷積神經網絡的車行環境多類障礙物檢測與識別》
  • 飛槳開發者創意薈:PaddleHub一鍵部署,AI創意實現原來如此簡單
  • eclipse左側欄目即包資源管理器怎么打開
  • 卷毛機器人符文_卷毛S6娜美輔助天賦 娜美輔助符文天賦S6最新
  • 天賦介紹
  • 蘋果怎么沒有4g信號還無服務器,不顯示4g信號怎么回事?蘋果手機不顯示4g信號的解決方法...
  • c4D體積生成和Quad Remesher重新拓撲減面插件