- 生成式AI實(shí)戰(zhàn)
- 歐陽(yáng)植昊 梁菁菁 呂云翔主編
- 980字
- 2024-12-12 17:57:41
1.1.3 PyTorch
PyTorch是由Facebook AI Research Lab開(kāi)發(fā)的一個(gè)開(kāi)源機(jī)器學(xué)習(xí)庫(kù)。它提供了類(lèi)似于NumPy的張量計(jì)算功能,且具有強(qiáng)大的GPU加速支持。PyTorch以其簡(jiǎn)潔的API和用戶(hù)友好的設(shè)計(jì)受到廣大研究人員和開(kāi)發(fā)者的喜愛(ài),特別適合于快速原型設(shè)計(jì)和研究。
1. 安裝PyTorch
在開(kāi)始使用之前,需要先安裝PyTorch。PyTorch官方網(wǎng)站提供了相關(guān)的安裝命令,你可以根據(jù)自己的操作系統(tǒng)和開(kāi)發(fā)環(huán)境(包括是否需要GPU支持)選擇正確的命令。例如,在大多數(shù)情況下,如果你使用的是pip且希望在CPU上運(yùn)行PyTorch,那么可以使用以下命令安裝PyTorch。
Shell pip install torch
小提示
為了減少運(yùn)行時(shí)的錯(cuò)誤,推薦使用與本書(shū)代碼環(huán)境一致的PyTorch 2.1.1版本進(jìn)行開(kāi)發(fā)。
2. 動(dòng)手實(shí)踐
張量是PyTorch中的基本構(gòu)建塊,可以將其看作高維數(shù)組或矩陣。張量支持自動(dòng)梯度計(jì)算,非常適合在神經(jīng)網(wǎng)絡(luò)中使用。
創(chuàng)建和操作張量的示例代碼如下。
Python import torch # 創(chuàng)建一個(gè)未初始化的3×2張量 x = torch.empty(3, 2) print(x) # tensor([[0., 0.], # [0., 0.], # [0., 0.]]) # 創(chuàng)建一個(gè)隨機(jī)初始化的張量 x = torch.rand(3, 2) print(x) # tensor([[0.5277, 0.0190], # [0.5107, 0.9485], # [0.5214, 0.6354]]) # 創(chuàng)建一個(gè)用0填充的張量,數(shù)據(jù)類(lèi)型為long x = torch.zeros(3, 2, dtype=torch.long) print(x) # tensor([[0, 0], # [0, 0], # [0, 0]]) # 直接根據(jù)數(shù)據(jù)創(chuàng)建張量 x = torch.tensor([[1, 2], [3, 4], [5, 6]]) print(x) # tensor([[1, 2], # [3, 4], # [5, 6]]) # 張量加法 y = torch.rand(3, 2) print(x + y) # tensor([[1.4600, 2.7211], # [3.6706, 4.3424], # [5.8336, 6.1341]]) # 使用torch.add進(jìn)行加法運(yùn)算 result = torch.empty(3, 2) torch.add(x, y, out=result) print(result) # tensor([[1.4600, 2.7211], # [3.6706, 4.3424], # [5.8336, 6.1341]])
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),反向傳播算法用于自動(dòng)計(jì)算模型參數(shù)的梯度。在PyTorch中,autograd包提供了這項(xiàng)功能。當(dāng)使用張量進(jìn)行相關(guān)操作時(shí),可以通過(guò)設(shè)置requires_grad為T(mén)rue以跟蹤對(duì)張量的所有操作。
以下是autograd包的一個(gè)簡(jiǎn)單示例。
Python import torch # 創(chuàng)建張量并設(shè)置requires_grad為T(mén)rue以跟蹤對(duì)張量的所有操作 x = torch.ones(2, 2, requires_grad=True) print(x) # tensor([[1., 1.], # [1., 1.]], requires_grad=True) # 對(duì)張量進(jìn)行操作 y = x + 2 print(y) # tensor([[3., 3.], # [3., 3.]], grad_fn=<AddBackward0>) # 因?yàn)閥是操作的結(jié)果,所以它有g(shù)rad_fn屬性 print(y.grad_fn) # <AddBackward0 object at 0x104bc6e50> # 對(duì)y進(jìn)行更多操作 z = y * y * 3 out = z.mean() print(z, out) # tensor([[27., 27.], # [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>) # 計(jì)算梯度 out.backward() # 打印梯度d(out)/dx print(x.grad) # tensor([[4.5000, 4.5000], # [4.5000, 4.5000]])
3. 構(gòu)建神經(jīng)網(wǎng)絡(luò)
在PyTorch中,torch.nn包負(fù)責(zé)構(gòu)建神經(jīng)網(wǎng)絡(luò)。nn.Module是所有神經(jīng)網(wǎng)絡(luò)模塊的基類(lèi),你的模型也應(yīng)該繼承這個(gè)類(lèi)。
以下是一個(gè)簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn),其中包含一個(gè)隱藏層。
Python import torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() # 包含1個(gè)輸入圖像通道、6個(gè)輸出通道的3×3的卷積核 self.conv1 = nn.Conv2d(1, 6, 3) self.conv2 = nn.Conv2d(6, 16, 3) # 仿射變換:y=Wx+b self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6來(lái)自圖像維度 self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): # 最大池化窗口(2, 2) x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) x = F.max_pool2d(F.relu(self.conv2(x)), 2) x = torch.flatten(x, 1) # 除了批量維度以外展平所有維度 x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net() print(net)
PyTorch提供了豐富的API和靈活的設(shè)計(jì)理念,非常適合進(jìn)行科學(xué)研究和原型設(shè)計(jì)。目前它是整個(gè)AI技術(shù)框架中非常流行的一個(gè)框架。
- 城堡里學(xué)無(wú)人機(jī):原理、系統(tǒng)與實(shí)現(xiàn)
- 成為提問(wèn)工程師
- 巧用ChatGPT進(jìn)行數(shù)據(jù)分析與挖掘
- TensorFlow知識(shí)圖譜實(shí)戰(zhàn)
- 物聯(lián)網(wǎng)+智能家居:移動(dòng)互聯(lián)技術(shù)應(yīng)用
- 人工智能+機(jī)器人入門(mén)與實(shí)戰(zhàn)
- 機(jī)器學(xué)習(xí)
- 強(qiáng)化學(xué)習(xí):原理與Python實(shí)現(xiàn)
- 人工智能技術(shù)與大數(shù)據(jù)
- 開(kāi)啟AI新紀(jì)元(全2冊(cè))
- 碼農(nóng)的零門(mén)檻AI課:基于fastai與PyTorch的深度學(xué)習(xí)
- AI律師助手:律師實(shí)務(wù)ChatGPT實(shí)戰(zhàn)指南
- 用ChatGPT輕松玩轉(zhuǎn)機(jī)器學(xué)習(xí)與深度學(xué)習(xí)
- 人工智能原理與應(yīng)用教程
- Python3智能數(shù)據(jù)分析快速入門(mén)