W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在開始學(xué)習(xí) PyTorch 之前,你需要了解 PyTorch 是一個(gè)開源的 Python 優(yōu)先深度學(xué)習(xí)框架,由 Torch7 團(tuán)隊(duì)開發(fā),它提供強(qiáng)大的 GPU 加速 Tensor 計(jì)算功能以及基于 tape 的自動(dòng)求導(dǎo)系統(tǒng),可用于構(gòu)建深度神經(jīng)網(wǎng)絡(luò)。你可以重用喜歡的 Python 包,如 numpy、scipy 和 Cython 來擴(kuò)展 PyTorch。
確保已安裝 Python,推薦使用編程獅平臺提供的 Python 安裝包進(jìn)行安裝。然后可以通過以下命令安裝 PyTorch:
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
此命令會(huì)安裝 PyTorch 及其相關(guān)庫。如果你的電腦沒有 NVIDIA GPU,可以使用以下命令安裝 CPU 版本:
pip3 install torch torchvision torchaudio
Tensor 是 PyTorch 中的基本數(shù)據(jù)結(jié)構(gòu),類似于 numpy 的 ndarray,但它可以在 GPU 上進(jìn)行計(jì)算,從而加速計(jì)算過程。
代碼示例:
import torch
## 創(chuàng)建一個(gè)未初始化的張量
x = torch.empty(2, 3)
print(x)
## 創(chuàng)建一個(gè)隨機(jī)初始化的張量
x = torch.rand(2, 3)
print(x)
## 創(chuàng)建一個(gè)全為 0 的張量
x = torch.zeros(2, 3, dtype=torch.long)
print(x)
## 創(chuàng)建一個(gè)從數(shù)據(jù)初始化的張量
x = torch.tensor([5.5, 3])
print(x)
## 創(chuàng)建一個(gè)張量并指定數(shù)據(jù)類型
x = torch.ones(2, 3, dtype=torch.double)
print(x)
print(x.size())
## 添加操作
y = torch.rand(2, 3)
print(x + y)
## 或者
print(torch.add(x, y))
## 提供輸出張量作為參數(shù)
result = torch.empty(2, 3)
torch.add(x, y, out=result)
print(result)
## 添加:提供 _ 來就地添加
## y.add_(x)
## print(y)
## 索引操作與 numpy 類似
print(x[:, 1])
## 調(diào)整大小 / 重塑張量
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())
## 如果你有一個(gè)包含一個(gè)元素的張量,使用 item() 來獲取這個(gè)值作為 Python 數(shù)字
x = torch.randn(1)
print(x)
print(x.item())
Autograd 是 PyTorch 中實(shí)現(xiàn)自動(dòng)求導(dǎo)的模塊,它能自動(dòng)計(jì)算張量操作的梯度,這是深度學(xué)習(xí)中反向傳播算法的關(guān)鍵。
代碼示例:
## 創(chuàng)建一個(gè)張量并設(shè)置 requires_grad=True 來跟蹤其計(jì)算歷史
x = torch.ones(2, 2, requires_grad=True)
print(x)
## 進(jìn)行張量操作
y = x + 2
print(y)
## y 被創(chuàng)建于操作中,因此它有一個(gè) grad_fn
print(y.grad_fn)
## 更多操作
z = y * y * 3
out = z.mean()
print(z, out)
## 反向傳播
out.backward()
## 現(xiàn)在調(diào)用張量的 .grad 屬性來獲取梯度
print(x.grad)
## 通常在開始新的梯度計(jì)算時(shí),需要將梯度置零
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
x.backward(gradients)
print(x.grad)
在 PyTorch 中構(gòu)建神經(jīng)網(wǎng)絡(luò)通常涉及定義模型類,該類繼承自 nn.Module
,并實(shí)現(xiàn) forward
方法。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 輸入圖像通道,6 輸出通道,5x5 卷積核
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
# 仿射操作:y=Wx+b
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# 最大池化,窗口大小為 2
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # 除去批次維度
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
params = list(net.parameters())
print(len(params))
print(params[0].size()) # 卷積核的權(quán)重
input = torch.randn(1, 1, 32, 32)
out = net(input)
print(out)
output = net(input)
target = torch.randn(10) # 示例目標(biāo)
target = target.view(1, -1) # 使目標(biāo)與輸出形狀相同
criterion = nn.MSELoss()
loss = criterion(output, target)
print(loss)
print(loss.grad_fn) # MSELoss
print(loss.grad_fn.next_functions[0][0]) # Linear
print(loss.grad_fn.next_functions[0][0].next_functions[0][0]) # ReLU
net.zero_grad() # 清空所有參數(shù)的梯度緩存
print('conv1.bias.grad before backward')
print(net.conv1.bias.grad)
loss.backward()
print('conv1.bias.grad after backward')
print(net.conv1.bias.grad)
learning_rate = 0.01
for f in net.parameters():
f.data.sub_(f.grad.data * learning_rate)
或者使用優(yōu)化器:
import torch.optim as optim
## 創(chuàng)建優(yōu)化器
optimizer = optim.SGD(net.parameters(), lr=0.01)
## 在訓(xùn)練循環(huán)中
optimizer.zero_grad() # 清空梯度
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() # 更新權(quán)重
一個(gè)典型的訓(xùn)練循環(huán)如下:
## 數(shù)據(jù)加載器
## 假設(shè) train_loader 是你的訓(xùn)練數(shù)據(jù)加載器
## for epoch in range(2): # 2 次完整訓(xùn)練
## for i, data in enumerate(train_loader, 0):
## # 獲取輸入及其標(biāo)簽
## inputs, labels = data
## ## # 零梯度
## optimizer.zero_grad()
## ## # 前向傳播 + 反向傳播 + 優(yōu)化
## outputs = net(inputs)
## loss = criterion(outputs, labels)
## loss.backward()
## optimizer.step()
## ## # 每 2000 批次打印一次統(tǒng)計(jì)信息
## if i % 2000 == 1999: # 打印 2000 批次
## print(f'[Epoch {epoch + 1}, Batch {i + 1}] loss: {loss.item():.3f}')
## print('完成訓(xùn)練')
## 保存模型
PATH = './programminglion_net.pth'
torch.save(net.state_dict(), PATH)
## 加載模型
## net.load_state_dict(torch.load(PATH))
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: