有了它,一天學會 PyTorch!

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
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 基礎入門實戰》,可免費試學前兩節,新課上線近期優惠價哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章