?自動微分訓練模型
?簡單代碼實現:
import torch
import torch.nn as nn
import torch.optim as optim# 定義一個簡單的線性回歸模型
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(1, 1) # 輸入維度是1,輸出維度也是1def forward(self, x):return self.linear(x)# 準備訓練數據
x_train = torch.tensor([[1.0], [2.0], [3.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0]])# 實例化模型、損失函數和優化器
model = LinearRegression()
criterion = nn.MSELoss() # 均方誤差損失函數
optimizer = optim.SGD(model.parameters(), lr=0.01) # 隨機梯度下降優化器# 訓練模型
epochs = 1000
for epoch in range(epochs):# 前向傳播outputs = model(x_train)loss = criterion(outputs, y_train)# 反向傳播optimizer.zero_grad() # 清空之前的梯度loss.backward() # 自動計算梯度optimizer.step() # 更新模型參數if (epoch+1) % 100 == 0:print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')# 測試模型
x_test = torch.tensor([[4.0]])
predicted = model(x_test)
print(f'預測值: {predicted.item():.4f}')
代碼分解:
1.定義一個簡單的線性回歸模型:
LinearRegression
?類繼承自nn.Module
,這是所有神經網絡模型的基類。- 在?
__init__
?方法中,定義了一個線性層?self.linear
,它的輸入維度是1,輸出維度也是1。 forward
?方法定義了數據在模型中的傳播路徑,即輸入?x
?經過?self.linear
?層后得到輸出。 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(1, 1) # 輸入維度是1,輸出維度也是1def forward(self, x):return self.linear(x)
2.準備訓練數據:
x_train
?和?y_train
?分別是輸入和目標輸出的訓練數據。每個張量表示一個樣本,x_train
?中的每個元素是一個維度為1的張量,因為模型的輸入維度是1。 x_train = torch.tensor([[1.0], [2.0], [3.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0]])
3.實例化模型,損失函數和優化器:
4.訓練模型:
- 這里進行了1000次迭代的訓練過程。
- 在每個迭代中,首先進行前向傳播,計算模型對?
x_train
?的預測輸出?outputs
,然后計算損失?loss
。 - 調用?
optimizer.zero_grad()
?來清空之前的梯度,然后調用?loss.backward()
?自動計算梯度,最后調用?optimizer.step()
?來更新模型參數。 epochs = 1000
for epoch in range(epochs):# 前向傳播outputs = model(x_train)loss = criterion(outputs, y_train)# 反向傳播optimizer.zero_grad() # 清空之前的梯度loss.backward() # 自動計算梯度optimizer.step() # 更新模型參數if (epoch+1) % 100 == 0:print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
5.測試模型:
運行結果:
運行結果如下:
?