有了它,一天学会 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 的切片類似,如下:
x = torch.rand(5, 3) print(x) print(x[1, 1]) # 第一個值表示第一維(即行號),第二個值表示第二維(即列號) print(x[:, 0]) # 所有的行中的第 1 列 print(x[1, :]) # 第 2 行中所有的列張量的重塑
重塑的意思就是將原張量的形狀進行變換,即元素總個數不變的情況下改變行數和列數,使用?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:
注意:一次切片中只能有一個位置值 -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 之中。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wIm2nXul-1597401569019)(https://upload-images.jianshu.io/upload_images/226662-158aadf71e71ec5b.jpg!thumbnail?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
完整課程請點擊鏈接《PyTorch 基礎入門實戰》,可免費試學前兩節,新課上線近期優惠價哦!
總結
以上是生活随笔為你收集整理的有了它,一天学会 PyTorch!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做个高颜值的优秀按钮,用 CSS3 实现
- 下一篇: 刚学会 HTML5 不久,最近用 CSS