PyTorch 是一個基於 Torch 的 Python 開源機器學習庫,它主要由 Facebook 的人工智能小組開發。該框架不僅能夠實現強大的 GPU 加速,還支持動態的神經網絡。
因此,很多互聯網的大廠在進行深度學習時,都會使用該框架,比如 Facebook、Twitter 等。
本課程一共 15 章,從淺入深地爲同學們闡述了 PyTorch 的語法結構和應用場景。
以下爲課程第一章:
張量的定義
介紹
PyTorch 中的所有操作都是在張量的基礎上進行的,本實驗主要講解了張量定義和相關張量操作以及 GPU 和張量之間的關係,爲以後使用 PyTorch 進行深度學習打下堅實的基礎。
知識點
- 張量的定義
- 張量的運算
- 張量的切片
張量
張量的定義
PyTorch 中的所有內容都基於 Tensor(張量) 操作的。張量可以具有不同的尺寸,它可以是 1 維(標量),2 維(矢量),甚至 3 維(矩陣)或更高。讓我們看一下如何在 PyTorch 中創建張量。
import torch
# 利用 torch.empty() 初始化指定大小的張量,如果不指定值的話,內容爲隨機值
# 傳入的參數爲想創建的張量大小
x = torch.empty(1) # scalar,大小爲 1*1 的張量
print(x.size())
x = torch.empty(3) # vector, 1D,大小爲 1*3 的張量
print(x.size())
x = torch.empty(2, 3) # matrix, 2D,大小爲 2*3 的張量
print(x.size())
x = torch.empty(2, 2, 3) # tensor, 3D,大小爲 2*2*3 的張量
print(x.size())
動手練習|如果你對課程所使用的實驗樓 Notebook 在線環境並不熟悉,可以先學習 使用指南課程。
如果我們需要隨機初始化值在 0-1 之間的張量(服從均勻分佈),可以使用 torch.rand(size)
:
# torch.rand(size)
torch.rand(5, 3) # 初始化 5*3 大小的 0-1 之間的張量
如果我們想初始化全爲 1 或者全爲 0 的張量,可以使用 torch.zeros(size)
和 torch.ones(size)
:
x = torch.zeros(5, 3)
y = torch.ones(5, 3)
print(x)
print(y)
可以通過 x.size()
得到某個張量的大小:
x.size()
可以通過 x.dtype
查看 x 中值的具體類型:
x.dtype
當然,也可以在初始化時傳入 dtype
參數,指定數組值的類型:
x = torch.zeros(5, 3, dtype=torch.float16)
print(x)
# check type
print(x.dtype)
如果我們需要創建指定值的張量,我們可以使用 torch.tensor(list)
,list 可以爲 NumPy 中的一個列表。
#創建的張量中的值爲 [5.5,3]
x = torch.tensor([5.5, 3])
print(x)
print(x.size())
如果想要定義的張量能夠自動計算梯度(後面會說明用處),那麼我們就需要將參數 requires_grad
置爲 True
。
torch.tensor([5.5, 3], requires_grad=True)
張量的運算
張量的加法:
y = torch.rand(2, 2)
x = torch.rand(2, 2)
z = x + y
z
張量的減法:
# 使用 - 或者 .sub 都可以表示張量減法
z = x - y
print(z)
z = torch.sub(x, y)
print(z)
張量乘法(利用 *
或者 torch.mul
表示):
# 張量乘法
z = x * y
print(z)
z = torch.mul(x, y)
print(z)
張量除法(使用 /
或者 torch.div
表示):
# 張量除法
z = x / y
print(z)
z = torch.div(x, y)
print(z)
張量的切片
和 NumPy 的切片類似,如下:
<pre>x = torch.rand(5, 3)
print(x)
print(x[1, 1]) # 第一個值表示第一維(即行號),第二個值表示第二維(即列號)
print(x[:, 0]) # 所有的行中的第 1 列
print(x[1, :]) # 第 2 行中所有的列</pre>
張量的重塑
重塑的意思就是將原張量的形狀進行變換,即元素總個數不變的情況下改變行數和列數,使用 torch.view(size)
類似於 numpy.reshape
。
x = torch.randn(4, 4)
y = x.view(16) # 指定改變後的大小
z = x.view(2, 8)
print(x.size(), y.size(), z.size())
當 x 的大小爲 12\times23\times32
12×23×32 ,而我們想把 x 轉爲 2\times m
2×m 的大小時,我們就必須手動算出 12\times23\times32
12×23×32 的值,然後除以 2,進而得到 m 的值。
爲了避免這種情況,我們可以將 m 所在位置賦爲 -1。計算機看到 -1 時,會自動使用 12\times23\times32 ÷ 2
12×23×32÷2 的值來替換 -1:
x = torch.randn(12, 23, 32)
y = x.view(2, -1) # 將需要計算的那個維度直接用 -1 表示 12*23*32/2 的值
x.size(), y.size()
注意:一次切片中只能有一個位置值 -1 。
NumPy 與 Tensor
可以使用 tensor.numpy()
將 Tensor 類型的變量轉爲 NumPy 類型:
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
print(type(b))
可以使用 torch.from_numpy()
將 NumPy 類型的變量轉爲 Tensor:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a)
print(b)
GPU 上創建張量
默認情況下,所有的張量都是在 CPU 上創建的,但是你也可以使用 GPU 創建它,或者將 CPU 創建的向量移動到 GPU 中。
當然,下面代碼只有在你的電腦支持 GPU 的情況下才能運行。
我們可以通過 torch.cuda.is_available()
命令,查看本地環境時候支持 GPU :
torch.cuda.is_available()
- True 表示支持
- False 表示不支持
由於 GPU 成本過高,本實驗我們暫且不使用(將其用在刀刃上),所以線上環境會返回 False。
由於本章節沒有配置 GPU ,因此下面兩段代碼只能闡述一下了。
將變量放到 GPU 中運行的方式有兩種,如下:
在定義時就指定參數 device
# 如果支持 GPU 則傳入字符串 cuda,否則傳入 cpu
device = torch.device("cuda")
y = torch.ones_like(x, device=device) # 在 GPU 上直接創建張量
創建張量後,將變量移動到 GPU 中
x = torch.randn(4, 4)
device = torch.device("cuda")
x = x.to(device) # 將張量移動到 GPU
實驗總結
本實驗主要講解了張量的定義,以及如何使用 PyTorch 完成張量的加、減、乘、除、切片和重塑等操作。在實驗的最後,我們對張量進行了擴展,闡述瞭如何查看本地環境是否支持 GPU ,以及如何將變量定義到 GPU 之中。
完整課程請點擊鏈接《PyTorch 基礎入門實戰》,可免費試學前兩節,新課上線近期優惠價哦!