【深度学习实验报告】实验 1:PyTorch 使用简介
實驗 1:PyTorch 使用簡介
一、實驗介紹
1.1 實驗內容
Pytorch 是由Facebook 支持的一套深度學習開源框架,相比較 Tensorflow, 它更加容易快速上手,所以一經推出就廣受歡迎。本課程是采用 Pytorch 開源框架進行案例講解的深度學習課程。Tensor(張量)是 PyTorch 的基礎數據結構, 自動微分運算是深度學習的核心。在本實驗中我們將學習 PyTorch 中 Tensor 的用法,以及簡單的自動微分變量原理,最后,我們還會使用 PyTorch 構建一個簡單的線性回歸網絡。
1.2 實驗知識點
-  PyTorch 簡介 
-  PyTorch 中的張量及其運算 
-  PyTorch 中的自動微分運算 
-  用 PyTorch 實現線性回歸 
1.3 實驗環境
-  Python3.9 
-  PyTorch1.10.2 
-  pycharm 
二、有關張量(Tensor)運算的練習
2.1 使用Tensor
PyTorch 是一個開源的深度學習框架,由 Facebook 支持開發。它的前身為Torch,但因為 Torch 使用的編程語言是 Lua,在國內流行度很小。Facebook 為了迎合數量更多的 Python 用戶的需求,推出了 PyTorch。PyTorch 完全開源意味著你可以輕易獲取它的代碼,并按照自己的需求對它進行修改。比如讓 PyTorch 支持復數運算等等。PyTorch 還有另外一個非常出眾的特點是,使用 PyT orch 框架編寫出的神經網絡模型的代碼非常簡潔。實現同樣的功能,使用 PyTorch 框架編寫的代碼往往更清晰明了
1 階的張量可以看做是一個向量,通過索引可以取到一個“值”。
2 階張量可以看做為一個矩陣,通過索引可以取到一個個的向量。
3 階張量有點抽象,不過我們可以從圖中看出,3 階張量其實就是在 2 階張量的矩陣中增加了一個深度。也就是說在 3 階張量中我們可以通過索引取到一個個的矩陣。我們不難想象,4 階張量也就是在 3 階張量上增加了另外一個軸……我們可以使用 **Tensor.size()**方法獲得一個張量的“尺寸”。在這里注意“尺寸”和維度是兩個概念。就比如對于上圖中的 1 階張量,它的維度為 1,尺寸為 8; 對于上圖中的 2 階張量,它的維度為 2,尺寸為(8,6)。
要使用 PyTorch,首先需要在 Python 中引入 PyTorch 的包
import torch # 計算機視覺軟件包 import torchvision# torch 版本 print(torch.__version__) # 計算機視覺軟件包版本 print(torchvision.__version__) # 是否有GPU 及其版本 print(torch.cuda.is_available()) print(torch.version.cuda) '''1.10.2 0.11.3 True 11.3''' # 沒有數據的創建選項: # print(torch.eye(2)) # print(torch.zeros(2, 2)) # print(torch.ones(2, 2)) # print(torch.rand(2, 2)) '''tensor([[1., 0.],[0., 1.]]) tensor([[0., 0.],[0., 0.]]) tensor([[1., 1.],[1., 1.]]) tensor([[0.3657, 0.9712],[0.9962, 0.9617]])'''2.2 基本 Tensor 運算
# 創建一個5*3的全1矩陣 y = torch.ones(5, 3) print(y)# 計算兩個矩陣相加 z = x + y print(z)# 矩陣轉置 print(y.t())# 矩陣相乘 print(x.mm(y.t()))# 點乘 print(x*y)轉置操作可以用.t()來完成,也可以用 transpose(0,1)來完成。
2.2 Tensor 與 numpy.ndarray 之間的轉換
PyTorch 的Tensor 可以與Python 的常用數據處理包Numpy 中的多維數組進行轉換。
import torch import numpy as np # 為深度學習創建PyTorch張量-最佳選擇 # Tensor與tensor區別: 區別是:默認數據類型與指定的數據類型。data = np.array([1, 2, 3])# 另外一種轉換 Tensor 的方法,為 torch.FloatTensor(data) t1 = torch.Tensor(data) t2 = torch.tensor(data) t3 = torch.as_tensor(data) t4 = torch.from_numpy(data)# print(t1) # print(t2) # print(t3) # print(t4) # print(t1.dtype) # print(t2.dtype) # print(t3.dtype) # print(t4.dtype)'''tensor([1., 2., 3.]) tensor([1, 2, 3], dtype=torch.int32) tensor([1, 2, 3], dtype=torch.int32) tensor([1, 2, 3], dtype=torch.int32) torch.float32 torch.int32 torch.int32 torch.int32'''# tensor 轉化為 numpy 的多維數組 print(t1.numpy()) '''[1. 2. 3.]'''Tensor 和 Numpy 的最大區別在于 Tensor 可以在 GPU 上進行運算。
默認情況下,Tensor 是在 CPU 上進行運算的,如果我們需要一個 Tensor
在 GPU 上的實例,需要運行這個 **Tensor 的.cuda()**方法。
在下面的代碼中,首先判斷在本機上是否有 GPU 環境可用(有 NVIDIA 的GPU,并安裝了驅動)。如果有 GPU 環境可用,那么再去獲得張量 x,y 的 GPU 實例。注意在最后打印 x 和 y 這兩個 GPU 張量的和的時候,我們調用了.cpu() 方法,意思是將 GPU 張量轉化為 CPU 張量,否則系統會報錯。
import torch x = torch.rand(5, 3) y = torch.ones(5, 3) if torch.cuda.is_available():x = x.cuda()y = y.cuda()z = x+yprint(z)print(z.cpu()) '''tensor([[1.4453, 1.6272, 1.3072],[1.9444, 1.2703, 1.8512],[1.8694, 1.1878, 1.8789],[1.5737, 1.8825, 1.4636],[1.8158, 1.9969, 1.8819]], device='cuda:0') tensor([[1.4453, 1.6272, 1.3072],[1.9444, 1.2703, 1.8512],[1.8694, 1.1878, 1.8789],[1.5737, 1.8825, 1.4636],[1.8158, 1.9969, 1.8819]])'''三、有關自動微分(Autograd)變量的練習
動態運算圖(DynamicComputationGraph)是 PyTorch 的最主要特性,它可以讓我們的計算模型更靈活、復雜,并可以讓反向傳播算法隨時進行。而反向傳播算法就是深度神經網絡的核心。
下面是一個計算圖的結構以及與它對應的 PyTorch 代碼:
import torch from torch.autograd import Variable N, D = 3, 4# 產生標準正態分布的隨機數或矩陣的函數 randn x = Variable(torch.randn(N, D), requires_grad=True) y = Variable(torch.randn(N, D), requires_grad=True) z = Variable(torch.randn(N, D), requires_grad=True)a = x*y b = a+z c = torch.sum(b) c.backward()print(x.grad) print(y.grad) print(z.grad)用來構建計算圖的數據叫做自動微分變量(Variable),它與 Tensor 不同。每個 Variable 包含三個屬性,分別對應著數據(data),父節點(creator), 以及梯度(grad)。其中**“梯度”就是反向傳播算法所要傳播的信息**。而父節點用于將每個節點連接起來構建計算圖(如上圖所示)。
下面我們編寫代碼實際使用自動微分變量。
import torch # 導入自動梯度運算包,主要用Variable這個類 from torch.autograd import Variable# 創建一個Variable ,包裹了2*2張量,將需要計算梯度屬性置為True x = Variable(torch.ones(2, 2), requires_grad=True) print(x) y = x+2 # 每個Variable都有一個creator (創造者節點) print(y.grad_fn) z = torch.mean(y*y) # .data 返回z包裹的Tensor print(z.data)# backward 可以實施反向傳播算法,并計算所有計算圖上葉子節點(沒有子節點)的導數(梯度)信息。 # 注意,由于 z 和 y 都不是葉子節點,所以都沒有梯度信息。 z.backward() print(z.retain_grad()) print(y.retain_grad()) # z對x的倒數 print(x.grad) import torch from torch.autograd import Variables = Variable(torch.FloatTensor([[0.01, 0.02]]), requires_grad=True)x = Variable(torch.ones(2, 2), requires_grad=True) for i in range(10):s = s.mm(x)z = torch.mean(s)z.backward() print(x.grad) print(s.grad) # s.grad 為None (s不是葉節點,沒有梯度信息)然后我們得到了一個復雜的“深度”計算圖:
四、實驗總結
在本節實驗中,熟悉了張量、自動微分變量的用法,認識了 PyTorch 中的計算圖。
總結
以上是生活随笔為你收集整理的【深度学习实验报告】实验 1:PyTorch 使用简介的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 交换机基础原理
- 下一篇: Hibernate VS iBATI
