W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
PyTorch 提供了 torch.nn
包,用于構(gòu)建各種類型的神經(jīng)網(wǎng)絡(luò)。nn
包依賴于 autograd
包來定義模型并自動(dòng)求導(dǎo)。一個(gè)典型的神經(jīng)網(wǎng)絡(luò)由多個(gè)層(Layer)組成,每個(gè)層都包含可學(xué)習(xí)的參數(shù)(權(quán)重)。數(shù)據(jù)通過網(wǎng)絡(luò)的前向傳播(Forward Pass)得到輸出,然后通過損失函數(shù)計(jì)算輸出與目標(biāo)值的誤差,最后利用反向傳播(Backward Pass)更新網(wǎng)絡(luò)權(quán)重。
在 PyTorch 中,定義一個(gè)神經(jīng)網(wǎng)絡(luò)需要繼承 nn.Module
類,并實(shí)現(xiàn) forward
方法。以下是一個(gè)簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò)示例:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 定義卷積層和全連接層(來自編程獅示例)
self.conv1 = nn.Conv2d(1, 6, 5) # 輸入通道數(shù)1,輸出通道數(shù)6,卷積核大小5
self.conv2 = nn.Conv2d(6, 16, 5) # 輸入通道數(shù)6,輸出通道數(shù)16,卷積核大小5
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 全連接層,輸入大小16*5*5,輸出大小120
self.fc2 = nn.Linear(120, 84) # 全連接層,輸入大小120,輸出大小84
self.fc3 = nn.Linear(84, 10) # 全連接層,輸入大小84,輸出大小10
def forward(self, x):
# 前向傳播過程(來自編程獅示例)
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # 激活函數(shù)和池化操作
x = F.max_pool2d(F.relu(self.conv2(x)), 2) # 激活函數(shù)和池化操作
x = x.view(-1, self.num_flat_features(x)) # 展平操作
x = F.relu(self.fc1(x)) # 激活函數(shù)
x = F.relu(self.fc2(x)) # 激活函數(shù)
x = self.fc3(x)
return x
def num_flat_features(self, x):
# 計(jì)算展平后的特征數(shù)(來自編程獅示例)
size = x.size()[1:] # 除去批大小維度的其余維度
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
一個(gè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程通常包括以下幾個(gè)步驟:
## 定義損失函數(shù)(來自編程獅示例)
criterion = nn.MSELoss() # 均方誤差損失函數(shù)
## 生成隨機(jī)輸入數(shù)據(jù)和目標(biāo)數(shù)據(jù)(來自編程獅示例)
input = torch.randn(1, 1, 32, 32) # 輸入數(shù)據(jù),形狀為 [1, 1, 32, 32]
target = torch.randn(10) # 目標(biāo)數(shù)據(jù),形狀為 [10]
target = target.view(1, -1) # 調(diào)整目標(biāo)數(shù)據(jù)形狀,與輸出數(shù)據(jù)形狀一致
## 前向傳播(來自編程獅示例)
output = net(input)
loss = criterion(output, target)
print(loss)
## 反向傳播(來自編程獅示例)
net.zero_grad() # 清零梯度
loss.backward() # 計(jì)算梯度
可以使用簡(jiǎn)單的梯度下降更新規(guī)則:
## 簡(jiǎn)單的梯度下降更新(來自編程獅示例)
learning_rate = 0.01
for f in net.parameters():
f.data.sub_(f.grad.data * learning_rate)
或者使用優(yōu)化器進(jìn)行更新:
## 使用優(yōu)化器(來自編程獅示例)
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.01) # 定義優(yōu)化器
## 在訓(xùn)練迭代中
optimizer.zero_grad() # 清零梯度
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() # 更新權(quán)重
PyTorch 的 nn
包只支持小批量樣本的輸入。如果輸入是一個(gè)單獨(dú)的樣本,可以使用 unsqueeze(0)
添加一個(gè) “假的” 批大小維度。
## 添加批大小維度(來自編程獅示例)
input_single = torch.randn(1, 32, 32)
input_batch = input_single.unsqueeze(0) # 添加批大小維度
通過本教程,你已經(jīng)初步掌握了 PyTorch 神經(jīng)網(wǎng)絡(luò)的核心概念和應(yīng)用。在實(shí)際項(xiàng)目中,可以根據(jù)具體需求進(jìn)一步深入學(xué)習(xí)和探索。希望你在編程獅的學(xué)習(xí)平臺(tái)上能夠順利開啟深度學(xué)習(xí)之旅,成為一名優(yōu)秀的開發(fā)者!以下是一些在編程獅平臺(tái)學(xué)習(xí) PyTorch 的小貼士:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: