目錄
一、 PyTorch 簡介
二、安裝 PyTorch
三、PyTorch 常用函數和操作
3.1 創建張量(Tensor)
3.2 基本數學運算
3.3 自動求導(Autograd)
3.4 定義神經網絡模型
3.5 訓練與評估模型
3.6 使用模型進行預測
四、注意事項
五、完整訓練示例代碼
一、 PyTorch 簡介
????????PyTorch 是由 Facebook 開發的開源深度學習框架,以動態計算圖(Dynamic Computational Graph)著稱,允許在運行時即時定義和修改模型結構,便于調試和研究。它支持 GPU 加速,并擁有豐富的生態系統,適用于自然語言處理、計算機視覺等眾多領域。
主要特點:
-
動態計算圖:每次運行時構建計算圖,便于調試和靈活性高。
-
自動求導(Autograd):支持自動求導,便于梯度計算與反向傳播。
-
模塊化設計:通過
torch.nn
提供豐富的神經網絡層及模塊,方便構建復雜模型。 -
豐富的生態:支持 torchvision、torchtext 等擴展庫,加速模型開發和實驗。
二、安裝 PyTorch
????????可參考YOLO系列環境配置及訓練_yolo環境配置-CSDN博客?中pytorch的安裝方法,以下簡要概括:(以安裝CPU版本為例)
pip install torch torchvision
安裝后,可以通過以下代碼驗證安裝及查看版本:
import torch
print("PyTorch 版本:", torch.__version__)
?CPU版本安裝成功的輸出示例為:
PyTorch 版本: 1.13.0
三、PyTorch 常用函數和操作
3.1 創建張量(Tensor)
????????與TensorFlow一樣,在 PyTorch 中的張量類似于 NumPy 的數組,同時支持 GPU 加速。
例如:
import torch# 創建標量、向量和矩陣
scalar = torch.tensor(5)
vector = torch.tensor([1, 2, 3])
matrix = torch.tensor([[1, 2], [3, 4]])print("標量:", scalar)
print("向量:", vector)
print("矩陣:\n", matrix)
樣例輸出:
標量: tensor(5)
向量: tensor([1, 2, 3])
矩陣:tensor([[1, 2],[3, 4]])
3.2 基本數學運算
????????PyTorch 同樣提供了基本的數學運算,例如:
a = torch.tensor(3.0)
b = torch.tensor(2.0)print("加法:", torch.add(a, b))
print("乘法:", torch.mul(a, b))
# 矩陣乘法
mat1 = torch.tensor([[1, 2]])
mat2 = torch.tensor([[3], [4]])
print("矩陣乘法:\n", torch.matmul(mat1, mat2))
樣例輸出:
加法: tensor(5.)
乘法: tensor(6.)
矩陣乘法:tensor([[11]])
3.3 自動求導(Autograd)
????????PyTorch 的 autograd 功能可以自動計算梯度,非常適合神經網絡反向傳播的實現。
例如:
# 定義一個需要計算梯度的張量
x = torch.tensor(2.0, requires_grad=True)# 定義函數 y = x3 + 2x + 1
y = x**3 + 2*x + 1# 反向傳播,計算 dy/dx
y.backward()print("dy/dx:", x.grad)
樣例輸出:
dy/dx: tensor(14.)
3.4 定義神經網絡模型
????????PyTorch 提供了 torch.nn
模塊來構建神經網絡模型。例如下面使用一個簡單的全連接層構建模型:
import torch.nn as nn
import torch.optim as optim# 定義一個簡單的神經網絡
class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc = nn.Linear(784, 10) # 輸入 784 維,輸出 10 維(例如手寫數字分類)def forward(self, x):out = self.fc(x)return out# 實例化模型并打印模型結構
model = SimpleNet()
print(model)
樣例輸出:
SimpleNet((fc): Linear(in_features=784, out_features=10, bias=True)
)
3.5 訓練與評估模型
在3.4的基礎上,我們繼續完善構建。
例如:
# 假設我們有一個批次的輸入數據(如手寫數字圖像,已展平為784維向量)
batch_size = 32
dummy_input = torch.randn(batch_size, 784) # 隨機生成一批數據
dummy_labels = torch.randint(0, 10, (batch_size,)) # 隨機生成對應的標簽# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 前向傳播
outputs = model(dummy_input)
loss = criterion(outputs, dummy_labels)print("初始損失:", loss.item())# 反向傳播和優化
optimizer.zero_grad()
loss.backward()
optimizer.step()# 再次輸出損失(注意:僅作為示例,損失值可能不會明顯下降)
outputs_after = model(dummy_input)
loss_after = criterion(outputs_after, dummy_labels)
print("更新后損失:", loss_after.item())
樣例輸出:
初始損失: 2.280543327331543
更新后損失: 2.2781271934509277
注意:?損失值會受到隨機數據和權重初始化的影響,實際訓練中損失下降情況應更為明顯。
3.6 使用模型進行預測
在 3.5 訓練結束后,我們可以通過調用模型的 forward
方法,可以對新的數據進行預測:
# 對一條測試數據進行預測
test_sample = torch.randn(1, 784)
pred_logits = model(test_sample)
pred_label = torch.argmax(pred_logits, dim=1)
print("預測類別:", pred_label.item())
樣例輸出:
預測類別: 7
四、注意事項
????????在訓練過程中,切忌混淆設備(Device),注意將模型和數據遷移到同一設備:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
inputs = inputs.to(device)
五、完整訓練示例代碼
import torch
import torch.nn as nn
import torch.optim as optim# 定義一個簡單的神經網絡
class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc = nn.Linear(784, 10) # 輸入 784 維,輸出 10 維(例如手寫數字分類)def forward(self, x):out = self.fc(x)return out# 實例化模型
model = SimpleNet()
print(model)# 設置設備(如果有 GPU 就用 GPU,否則用 CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)# 假設我們有一個批次的輸入數據(如手寫數字圖像,已展平為784維向量)
batch_size = 32
dummy_input = torch.randn(batch_size, 784).to(device) # 隨機生成一批數據并遷移到 device
dummy_labels = torch.randint(0, 10, (batch_size,)).to(device) # 隨機生成對應的標簽并遷移到 device# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 前向傳播
outputs = model(dummy_input)
loss = criterion(outputs, dummy_labels)
print("初始損失:", loss.item())# 反向傳播和優化
optimizer.zero_grad()
loss.backward()
optimizer.step()# 再次輸出損失(僅作為示例,損失值可能不會明顯下降)
outputs_after = model(dummy_input)
loss_after = criterion(outputs_after, dummy_labels)
print("更新后損失:", loss_after.item())# 對一條測試數據進行預測
test_sample = torch.randn(1, 784).to(device)
pred_logits = model(test_sample)
pred_label = torch.argmax(pred_logits, dim=1)
print("預測類別:", pred_label.item())