深度學習-Pytorch框架學習之張量處理篇

2021-01-11 鄉村音悅臺

1. 數據類型

根據官方文檔顯示,張量定義為包含單一數據類型元素的多維矩陣。

在Pytorch中,有9種CPU張量類型和9種GPU張量類型。具體類型如下圖所示:

在Pytorch中,可以通過Python 列表和torch.tensor()構造函數構造一個張量。

torch.tensor([[1., -1.], [1., -1.]])

torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))

2. 張量的基本信息

tensor = torch.randn(2,3,4)

print(tensor.type()) # 數據類型 torch.FloatTensor,是一個浮點型的張量

print(tensor.size()) # 張量的shape,是個元組 torch.Size([2, 3, 4])

print(tensor.dim()) # 維度的數量 3

3. 張量的命名

程序中,一個好的命名可以便於其他人讀懂代碼,張量的命名也是如此。這樣可以方便地使用維度的名字來做索引或其他操作,提高了可讀性、易用性,防止程序出錯,便於其他人閱讀和修改。

# 在PyTorch 1.3之前,需要使用注釋

# Tensor[N, C, H, W]

images = torch.randn(32, 3, 56, 56)

images.sum(dim=1)

images.select(dim=1, index=0)

# PyTorch 1.3之後

NCHW = [『N』, 『C』, 『H』, 『W』]

images = torch.randn(32, 3, 56, 56, names=NCHW)

images.sum('C')

images.select('C', index=0)

# 也可以這麼設置

tensor = torch.rand(3,4,1,2,names=('C', 'N', 'H', 'W'))

# 使用align_to可以對維度方便地排序

tensor = tensor.align_to('N', 'C', 'H', 'W')

4.張量數據類型轉換

在Pytorch中,FloatTensor處理速度遠遠快於DoubleTensor,因此默認採用FloatTensor,也可以通過轉換變成其他類型的數據。

# 設置默認類型

torch.set_default_tensor_type(torch.FloatTensor)

# 類型轉換

tensor = tensor.cuda()

tensor = tensor.cpu()

tensor = tensor.float()

tensor = tensor.long()

4.1 torch.Tensor與np.ndarray轉換

除了CharTensor類型外,其他所有CPU上的張量都支持轉換為numpy格式,當然也可以再轉換回來。

ndarray = tensor.cpu().numpy()

tensor = torch.from_numpy(ndarray).float()

tensor = torch.from_numpy(ndarray.copy()).float() # If ndarray has negative stride.

4.2 torch.tensor與PIL.Image轉換

在Pytorch中,張量默認採用[N, C, H, W]的順序,並且數據範圍在[0,1],有時候處理數據時需要進行轉置和規範化。

# torch.Tensor -> PIL.Image

image = PIL.Image.fromarray(torch.clamp(tensor*255, min=0, max=255).byte().permute(1,2,0).cpu().numpy())

image = torchvision.transforms.functional.to_pil_image(tensor)

# PIL.Image -> torch.Tensor

path = r'./figure.jpg'

tensor = torch.from_numpy(np.asarray(PIL.Image.open(path))).permute(2,0,1).float() / 255

tensor = torchvision.transforms.functional.to_tensor(PIL.Image.open(path)) # Equivalently way

5.張量的常用操作

5.1 矩陣乘法

# Matrix multiplcation: (m*n) * (n*p) * -> (m*p).

result = torch.mm(tensor1, tensor2)

# Batch matrix multiplication: (b*m*n) * (b*n*p) -> (b*m*p)

result = torch.bmm(tensor1, tensor2)

# Element-wise multiplication.

result = tensor1 * tensor2

5.2 計算兩組數據之間的兩兩歐式距離

dist = torch.sqrt(torch.sum((X1[:,None,:] - X2) ** 2, dim=2))

5.3 張量形變

將卷積層輸入全連接層的情況時,通常需要對張量做形變處理如.view()和.reshape()等,但是相比torch.view,torch.reshape可以自動處理輸入張量不連續的情況。

tensor = torch.rand(2,3,4)

shape = (6, 4)

tensor = torch.reshape(tensor, shape)

5.4 打亂順序

tensor = tensor[torch.randperm(tensor.size(0))] # 打亂第一個維度

5.5 水平翻轉

Pytorch不支持tensor[::-1]這樣的負步長操作,水平翻轉可以通過張量索引實現。

# 假設張量的維度為[N, D, H, W].

tensor = tensor[:, :, :, torch.arange(tensor.size(3) - 1, -1, -1).long()]

5.6 張量複製

tensor.clone()

tensor.detach()

tensor.detach.clone()

5.7 張量拼接

torch.cat和torch.stack的區別在於torch.cat沿著給定的維度拼接,而torch.stack會新增一維。當參數是3個10x5的張量,torch.cat的結果是30x5的張量,而torch.stack的結果是3x10x5的張量。

tensor = torch.cat(list_of_tensors, dim=0)

tensor = torch.stack(list_of_tensors, dim=0)

5.8 將整數標籤轉為one-hot編碼

Pytorch的標記默認從0開始,轉換為one-hot編碼在數據處理時也經常用到。

tensor = torch.tensor([0, 2, 1, 3])

N = tensor.size(0)

num_classes = 4

one_hot = torch.zeros(N, num_classes).long()

one_hot.scatter_(dim=1, index=torch.unsqueeze(tensor, dim=1), src=torch.ones(N, num_classes).long())

5.9 得到非零元素

torch.nonzero(tensor) # index of non-zero elements,索引非零元素

torch.nonzero(tensor==0) # index of zero elements,索引零元素

torch.nonzero(tensor).size(0) # number of non-zero elements,非零元素的個數

torch.nonzero(tensor == 0).size(0) # number of zero elements,零元素的個數

5.10 張量擴展

將64*512的張量擴展為64*512*7*7的張量

tensor = torch.rand(64,512)

torch.reshape(tensor, (64, 512, 1, 1)).expand(64, 512, 7, 7)

未完待續

如有遺漏或在錯誤的地方,希望大家指出;如果還有大家認為很重要的張量操作,也麻煩大家指出,互相進步,不甚感激!

相關焦點

  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    選自heartbeat.fritz.ai作者:Derrick Mwiti機器之心編譯參與:Geek AI、王淑婷這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    選自builtin作者:Vihar Kurama機器之心編譯參與:吳攀、杜偉谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社區歡迎的兩種深度學習框架。那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    選自PyTorch.org機器之心編譯參與:吳攀、李澤南、李亞洲Torch7 團隊開源了 PyTorch。據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。
  • 深度學習基礎:張量運算
    字幕組雙語原文:深度學習基礎:張量運算英語原文:Tensor Operations — Basic Building Blocks of Deep Learning翻譯:雷鋒字幕組(大表哥、Shangru)2012-至今:深度學習爆炸時代在2012年的Imagenet運動之後,深度學習取得了突飛猛進的發展。
  • Keras vs PyTorch:誰是第一深度學習框架?
    兩大框架的連結:  Keras:https://github.com/keras-team/keras (https://keras.io/)  PyTorch:https://github.com/pytorch/pytorch  你想學習深度學習嗎?
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    PyTorch是一個基於Torch的Python開源機器學習庫,用於自然語言處理等應用程式。它主要由Facebookd的人工智慧小組開發,不僅能夠 實現強大的GPU加速,同時還支持動態神經網絡,這一點是現在很多主流框架如TensorFlow都不支持的。
  • PyTorch官方出品了一本深度學習書,免費提供給開發者
    根據出版商Manning出版社的介紹,這本書的核心,是教你如何使用Python 和 PyTorch 實現深度學習算法。所以出版商介紹稱,想要更好的消化這本書,需要對Python知識和基本線性代數有了解,對深度學習有一些理解更好,但並不需要你具備使用PyTorch或其他深度學習框架的經驗。
  • 迎來PyTorch,告別 Theano,2017 深度學習框架發展大盤點
    深度學習是機器學習中一種基於對數據進行表徵學習的方法,作為當下最熱門的話題,谷歌、Facebook、微軟等巨頭紛紛圍繞深度學習做了一系列研究,一直在支持開源深度學習框架的建設。過去一年間,在這些巨頭的加持下,深度學習框架格局發生了極大改變:新框架橫空出世,舊的框架也逐漸退出歷史舞臺,而框架與框架之間的聯繫也更加緊密,生態更為開放。
  • Facebook 開源 3D 深度學習函數庫 PyTorch3D
    原標題:Facebook開源3D深度學習函數庫PyTorch3D來源:開源中國Facebook近日開源了將PyTorch用於3D深度學習的函數庫PyTorch3D,這是一個高度模塊化且經過優化的庫,具備獨有的功能,旨在通過PyTorch簡化3D深度學習。
  • PyTorch框架歷史和特性更迭與安裝過程
    PyTorch是由Facebook公司開發的深度學習框架,其起源應該是Torch這個深度學習框架。Torch深度學習框架最初的開發可以追溯到2002年。相比使用Python語言作為深度學習框架前端的PyTorch,Torch使用了Lua語言作為深度學習框架的前端。由於機器學習的主流語言是Python,相比之下,Lua語言比較小眾。
  • 60分鐘入門深度學習工具PyTorch
    五、數據並行一、PyTorch 是什麼他是一個基於Python的科學計算包,目標用戶有兩類為了使用GPU來替代numpy一個深度學習研究平臺:提供最大的靈活性和速度開始張量(Tensors)張量類似於numpy的ndarrays,不同之處在於張量可以使用GPU來加快計算。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    對於許多開發者來說,TensorFlow是他們接觸的第一個機器學習框架。TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。
  • 教程| 斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現...
    作者:李飛飛等機器之心編譯參與:Smith、蔣思源史丹福大學的課程 CS231n (Convolutional Neural Networks for Visual Recognition) 作為深度學習和計算機視覺方面的重要基礎課程,在學界廣受推崇。
  • 《PyTorch中文手冊》來了
    PyTorch 是一個深度學習框架,旨在實現簡單靈活的實驗。自 2017 年初首次推出,PyTorch 很快成為 AI 研究人員的熱門選擇並受到推崇。PyTorch 1.0 增加了一系列強大的新功能,大有趕超深度學習框架老大哥 TensorFlow 之勢。因此,學習 PyTorch 大有裨益!
  • 圖靈獎得主力推:PyTorch 1.3 今天發布
    機器之心報導參與:一鳴、思今天凌晨,PyTorch 開發者大會在舊金山開幕,會上發布了最新版本 PyTorch1.3。本次更新最大的亮點在於對行動裝置的支持、挑戰傳統張量的「命名張量」,以及更好的性能改進。今天,PyTorch1.3 發布了。圖靈獎得主,被譽為「深度學習三座山頭」之一的 LeCun 發推稱讚。
  • Deep CARs:使用Pytorch學習框架實現遷移學習
    更準確地說,是使用一個深度神經網絡,因此得名Deep CARs(深度計算機自動額定值系統)。想要實現這一目標,需要完成兩部分的學習,第1部分:構建汽車分類器;第2部分:部署分類器。本文將著重論述第1部分內容。我們將使用一種叫做遷移學習的方法來訓練分類器。什麼是遷移學習?
  • 深度學習框架太抽象?其實不外乎這五大核心組件
    為了更好地認識深度學習框架,也為了給一些想要自己親手搭建深度學習框架的朋友提供一些基礎性的指導,日前來自蘇黎世聯邦理工學院計算機科學系的碩士研究生Gokula Krishnan Santhanam在博客上撰文,概括了大部分深度學習框架都會包含的五大核心組件,為我們詳細剖析了深度學習框架一般性的內部組織結構。以下由雷鋒網編譯。
  • MIT Taco項目:自動生成張量計算的優化代碼,深度學習加速效果提高...
    傳統上,為了處理張量計算,數學軟體將張量運算分解為不同組成部分進行計算,例如如果需要計算兩個張量相乘加第三個向量,則軟體將在前兩個張量上運行其標準張量乘法程序,存儲結果,然後再運行其標準張量加法。舉例來說,目前我們常用的深度學習框架,如TensorFlow、PyTorch等都會將一個深度學習的模型轉換為一個由基本計算符組成的數據流圖,再有下層的計算引擎一次調度執行這些節點對應的內核函數(對於數據圖的動態優化參見雷鋒網此前文章《緊跟未來深度學習框架需求,TensorFlow推出Eager Execution》)。
  • 用PyTorch做深度學習實驗!Facebook新框架Ax和BoTorch雙雙開源
    在現代機器學習應用中,對實驗到生產的流程進行簡化是最難實現的任務之一。在已經市場化深度學習框架中,Facebook的PyTorch因其高度靈活性成為數據科學界的最愛,PyTorch能夠實現快速建模和實驗。但是,深度學習應用中的許多實驗面臨的挑戰已經超出了特定框架的能力範圍。
  • PyTorch 1.7發布,支持CUDA 11、Windows分布式訓練
    torchvision(穩定版)transforms 支持張量輸入、批處理計算、GPU 和 TorchScript(穩定版)JPEG 和 PNG 格式的原生圖像 I/O(測試版)新型視頻讀取器 APItorchaudio(穩定版)增加了對語音錄製