当前位置: 首页>C++>正文

Pytorch學習筆記——Contiguous vs non-contiguous tensor

Pytorch學習筆記——Contiguous vs non-contiguous tensor

文章目錄

  • 前言
  • 正文
  • 調用contiguous會導致內存復制操作嗎?

前言

原文地址:https://discuss.pytorch.org/t/contigious-vs-non-contigious-tensor/30107

正文

Contiguous是一個標志,指示張量在內存中是否連續存儲。
讓我們舉個例子來看看,我們如何得到一個非連續的張量。

# 創建一個形狀是[4, 3]的張量
x = torch.arange(12).view(4, 3)
print(x, x.stride())> tensor([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
# 步幅,stride
> (3, 1)   

如你所見,張量具有所要的形狀,也就是[4, 3]。步幅(stride)也很有趣,它告訴我們,我們在內存中需要跳過多少個位置(step),才可以沿著某個軸(axis)移動到下一個位置。

如果我們看一下步幅(stride),我們會看到,我們必須跳過3個值才能轉到新行,而只需跳過1個值就能轉到下一列。
到目前為止都很好理解。
這些值按順序存儲在內存中,即內存單元應將數據[0,1,2,3,…,11]保存到連續地址空間。

現在讓我們轉置張量,并再次看一下步幅:

y = x.t()   # 轉置
print(y, y.stride())
print(y.is_contiguous())> tensor([[ 0,  3,  6,  9],[ 1,  4,  7, 10],[ 2,  5,  8, 11]]) > (1, 3)   # 步幅
> False    # 是否連續

print 語句正確地輸出了張量的x的轉置視圖。
但是,步幅現在已經互換了
為了轉到下一行,我們只需要跳過1個值,而轉到下一列需要跳過3個值。

這也說得通,如果我們回想一下張量在內存中的布局:

注意:轉置并沒有讓內存中的布局發生改變。

[0, 1, 2, 3, 4, ..., 11]

為了移動到下一列(例如,從0到3,我們必須跳過3個值。
因此,張量不再是不連續的!

這對我們來說并不是一個真正的問題,除了某些操作不起作用。
例如,如果我們嘗試獲得 y 的扁平化視圖,我們將遇到運行時錯誤:

try:y = y.view(-1)   # 希望的到y的一維向量試圖
except RuntimeError as e:print(e)
> invalid argument 2: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Call .contiguous() before .view().
So let’s call .contiguous() before the view call:y = y.contiguous()   # 顯示調用contiguous方法>>> y
tensor([[ 0,  3,  6,  9],[ 1,  4,  7, 10],[ 2,  5,  8, 11]])print(y.stride())
> (4, 1)>>> y.view(-1)
tensor([ 0,  3,  6,  9,  1,  4,  7, 10,  2,  5,  8, 11])

現在,內存布局再次是連續的(看看步幅),view工作正常。
我不完全確定,但我假設調用contiguous會調用復制操作讓內存再次連續。

也就是說,連續數組對于某些矢量化指令工作是必要的前提條件。

調用contiguous會導致內存復制操作嗎?

如果在非連續張量上調用 contiguous,則將執行復制,否則,這將是一個沒有影響的操作。

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

相关文章:

  • Pytorch學習筆記——Contiguous vs non-contiguous tensor
  • 問題 A: 英雄聯盟陣營
  • 英雄聯盟用什么語言編寫?C/C++ yyds
  • X光機申請日本PMDA認證指南《藥品與醫療器械法》
  • C++:for循環執行順序
  • 大小寫字母轉換、數字與字符轉換及ASCII碼表
  • 2020 年,蘋果的 AI 還有創新嗎?
  • 上古卷軸3晨風職業_《上古卷軸》全系列回顧及劇情簡介
  • 架構之美筆記
  • Solid Converter pdf v9.x注冊碼
  • 「冰果」一曲新時代的招隱之歌
  • android病毒可以殺掉嗎,央視曝光史上最嚴重危害Android病毒“幽靈推”
  • linux查看是否有漏洞,Linux Lite開發者推傻瓜式腳本:輕松查看是否已修復CPU漏洞...
  • 「MtOI2019」幽靈樂團
  • 搶跑全球同性社交第一股 Blued能否借粉紅經濟“博君一笑”?
  • 基于jetson nano和yolov5?的 車行人檢測(一)
  • MIT
  • 【C++進階】智能指針(萬字詳解)
  • YonBuilder專業版開發之新增規則操作(回錄視頻操作)第貳篇
  • 【C4D】模型倒角時出現破面,倒角不了,怎么辦?
  • c4dr17語言,(全部更新完畢)(魚魚老師中文字幕)C4DR17全面基礎教程
  • C4D R19學習之 001界面認識
  • 使用CCProxy搭建部署linux centos7內網代理上網
  • 看程序學css-4 綜合應用
  • 數據分析--經典語錄匯總
  • Data Mining數據分析經典語錄匯總
  • 2015下半年蘇子語錄《我的人生感悟…
  • 調侃計算機專業的句子,適合調侃的幽默句子
  • pandas數據讀取處理詳解
  • 扎實基礎深入篇(六):while循環帶動生產力