一、Pytorch簡介與安裝¶
Pytorch是一個基於Python的科學計算庫,尤其擅長深度學習任務。它的優勢在於動態計算圖,這讓模型調試更直觀,代碼更易讀,非常適合初學者上手。
安裝命令很簡單:
pip install torch
安裝完成後,我們可以通過import torch驗證是否成功。
二、Pytorch基礎:張量(Tensor)¶
張量是Pytorch的核心數據結構,類似於NumPy數組,但支持GPU加速。
1. 創建張量¶
import torch
# 創建1D張量
x = torch.tensor([1, 2, 3])
print(x) # 輸出: tensor([1, 2, 3])
# 創建2D張量(矩陣)
y = torch.tensor([[1, 2], [3, 4]])
print(y)
# 輸出: tensor([[1, 2],
# [3, 4]])
# 創建隨機張量(均值0,方差1)
z = torch.randn(2, 3) # 形狀爲(2,3)的隨機張量
print(z)
2. 張量操作¶
張量支持加減乘除等基本運算,語法和NumPy類似:
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b) # 輸出: tensor([5, 7, 9])
print(a * b) # 輸出: tensor([4, 10, 18])
# 矩陣乘法
m1 = torch.tensor([[1, 2], [3, 4]])
m2 = torch.tensor([[5, 6], [7, 8]])
print(torch.matmul(m1, m2)) # 或 m1 @ m2
# 輸出: tensor([[19, 22],
# [43, 50]])
3. 張量與NumPy互轉¶
import numpy as np
# 張量轉NumPy
n = z.numpy()
print(type(n)) # 輸出: <class 'numpy.ndarray'>
# NumPy轉張量
t = torch.from_numpy(n)
print(type(t)) # 輸出: <class 'torch.Tensor'>
三、自動求導(Autograd)¶
模型訓練需要計算梯度,Pytorch的autograd模塊自動完成梯度計算。
例子:計算導數¶
假設函數:y = x² + 3x,求當x=2時的導數dy/dx。
x = torch.tensor(2.0, requires_grad=True) # 標記x需要計算梯度
y = x**2 + 3 * x
# 反向傳播求梯度
y.backward() # 計算y對所有requires_grad=True的變量的梯度
print(x.grad) # 輸出: tensor(7.) (因爲dy/dx=2x+3,x=2時爲7)
關鍵點:requires_grad=True告訴Pytorch需要跟蹤x的操作,以便後續計算梯度。
四、模型構建:線性迴歸(基礎模型)¶
模型構建是Pytorch的核心,我們從最簡單的線性模型開始:y = wx + b(w:權重,b:偏置)。
1. 定義線性模型¶
使用nn.Module基類定義模型,核心是forward方法(前向傳播):
import torch.nn as nn
class LinearRegression(nn.Module):
def __init__(self, input_size, output_size):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(input_size, output_size) # 線性層:y = wx + b
def forward(self, x):
return self.linear(x) # 前向傳播
# 初始化模型(輸入維度1,輸出維度1)
model = LinearRegression(input_size=1, output_size=1)
解釋:
- nn.Linear(in_features, out_features):創建線性層,參數爲輸入特徵數和輸出特徵數。
- forward(x):定義模型的前向計算邏輯。
五、數據準備:模擬數據集¶
我們用一個簡單的模擬數據集訓練模型:假設真實關係爲y = 2x + 3 + 噪聲,生成數據並模擬訓練集。
1. 生成數據¶
import torch
import numpy as np
# 生成100個樣本,x範圍在[0, 10],帶噪聲
np.random.seed(42)
x = np.random.rand(100, 1) * 10 # x: (100,1)
noise = np.random.randn(100, 1) * 1.5 # 噪聲
y = 2 * x + 3 + noise # 真實關係:y = 2x + 3 + 噪聲
# 轉爲Pytorch張量
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y)
2. 數據加載¶
用TensorDataset和DataLoader批量加載數據:
from torch.utils.data import TensorDataset, DataLoader
# 組合數據和標籤
dataset = TensorDataset(x_tensor, y_tensor)
dataloader = DataLoader(dataset, batch_size=10, shuffle=True) # 批量大小10,打亂數據
六、模型訓練:損失函數與優化器¶
訓練模型需要三個核心步驟:計算損失、反向傳播、參數更新。
1. 定義損失函數和優化器¶
criterion = nn.MSELoss() # 均方誤差損失(MSE)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # SGD優化器,學習率0.01
2. 訓練循環¶
epochs = 1000 # 訓練輪數
for epoch in range(epochs):
for batch_x, batch_y in dataloader:
# 前向傳播:模型預測
pred = model(batch_x)
# 計算損失
loss = criterion(pred, batch_y)
# 反向傳播:清零梯度 → 計算梯度 → 更新參數
optimizer.zero_grad() # 清零梯度(避免累積)
loss.backward() # 反向傳播計算梯度
optimizer.step() # 更新參數(w和b)
# 每100輪打印損失
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
關鍵步驟:
- optimizer.zero_grad():必須在每次迭代中清零梯度,否則會累積上一輪的梯度。
- loss.backward():計算損失對所有可學習參數的梯度。
- optimizer.step():根據梯度更新模型參數(w和b)。
七、模型驗證與可視化¶
訓練後,我們用模型預測並可視化結果:
import matplotlib.pyplot as plt
# 預測結果
predicted = model(x_tensor).detach().numpy() # 移除梯度信息,轉爲NumPy
# 繪圖對比
plt.scatter(x, y, label='真實數據')
plt.plot(x, predicted, 'r-', label='預測結果')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
# 打印學習到的參數
print("學習到的權重w:", model.linear.weight.item()) # 接近2
print("學習到的偏置b:", model.linear.bias.item()) # 接近3
八、總結與擴展¶
通過這個例子,我們掌握了Pytorch的核心流程:
1. 張量操作與自動求導是基礎;
2. nn.Module定義模型,forward實現前向傳播;
3. DataLoader處理批量數據,提升訓練效率;
4. 損失函數(MSE)和優化器(SGD)驅動參數更新。
擴展方向:嘗試更復雜的模型(如多層網絡)、更換優化器(Adam)或損失函數(交叉熵損失)。Pytorch的靈活性讓你可以輕鬆構建任何深度學習模型!
希望這篇入門教程能幫你快速上手Pytorch,下次我們可以探索更復雜的模型(如CNN、RNN)或真實數據集(如MNIST)。