官术网_书友最值得收藏!

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è)框架。

主站蜘蛛池模板: 光山县| 莲花县| 永善县| 郓城县| 永安市| 樟树市| 岚皋县| 息烽县| 义马市| 泰安市| 邻水| 米易县| 永州市| 东城区| 西华县| 金塔县| 赫章县| 阿城市| 敦煌市| 灌南县| 和硕县| 东山县| 洞口县| 麦盖提县| 西峡县| 安仁县| 绥江县| 甘德县| 随州市| 西乌| 鹤壁市| 万盛区| 乌什县| 怀安县| 天津市| 郴州市| 民县| 德保县| 衡阳县| 溧阳市| 托克托县|