OPTIMIZING MODEL PARAMETERS (模型參數優化)
現在我們有了模型和數據,是時候通過優化數據上的參數來訓練了,驗證和測試我們的模型。訓練一個模型是一個迭代的過程,在每次迭代中,模型會對輸出進行猜測,計算猜測數據與真實數據的誤差(損失),收集誤差對其參數的導數(正如前一節我們看到的那樣),并使用梯度下降優化這些參數。
Prerequisite Code ( 先決代碼 )
We load the code from the previous sections on
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transformstraining_data = datasets.FashionMNIST(root = "../../data/",train = True,download = True, transform = transforms.ToTensor()
)test_data = datasets.FashionMNIST(root = "../../data/",train = False,download = True, transform = transforms.ToTensor()
)train_dataloader = DataLoader(training_data, batch_size = 32, shuffle = True)
test_dataloader = DataLoader(test_data, batch_size = 32, shuffle = True)class NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork, self).__init__()self.flatten = nn.Flatten()self.linear_relu_stack = nn.Sequential(nn.Linear(28 * 28, 512),nn.ReLU(),nn.Linear(512, 512),nn.ReLU(),nn.Linear(512, 10) )def forward(self, x):out = self.flatten(x)out = self.linear_relu_stack(out)return outmodel = NeuralNetwork()
Hyperparameters ( 超參數 )
超參數是可調節的參數,允許控制模型優化過程,不同的超參數會影響模型的訓練和收斂速度。read more
我們定義如下的超參數進行訓練:
Number of Epochs: 遍歷數據集的次數
Batch Size: 每一次使用的數據集大小,即每一次用于訓練的樣本數量
Learning Rate: 每個 batch/epoch 更新模型參數的速度,較小的值會導致較慢的學習速度,而較大的值可能會導致訓練過程中不可預測的行為,例如訓練抖動頻繁,有可能會發散等。
learning_rate = 1e-3
batch_size = 32
epochs = 5
Optimization Loop ( 優化循環 )
我們設置完超參數后,就可以利用優化循環訓練和優化模型;優化循環的每次迭代稱為一個 epoch, 每個 epoch 包含兩個主要部分:
The Train Loop: 遍歷訓練數據集并嘗試收斂到最優參數。
The Validation/Test Loop: 驗證/測試循環—遍歷測試數據集以檢查模型性能是否得到改善。
讓我們簡單地熟悉一下訓練循環中使用的一些概念。跳轉到前面以查看優化循環的完整實現。
Loss Function ( 損失函數 )
當給出一些訓練數據時,我們未經訓練的網絡可能不會給出正確的答案。 Loss function 衡量的是得到的結果與目標值的不相似程度,是我們在訓練過程中想要最小化的 Loss function。為了計算 loss ,我們使用給定數據樣本的輸入進行預測,并將其與真實的數據標簽值進行比較。
常見的損失函數包括nn.MSELoss (均方誤差)用于回歸任務,nn.NLLLoss(負對數似然)用于分類神經網絡。nn.CrossEntropyLoss 結合 nn.LogSoftmax 和 nn.NLLLoss 。
我們將模型的輸出 logits 傳遞給 nn.CrossEntropyLoss ,它將規范化 logits 并計算預測誤差。
# Initialize the loss function
loss_fn = nn.CrossEntropyLoss()
Optimizer ( 優化器 )
優化是在每個訓練步驟中調整模型參數以減少模型誤差的過程。優化算法定義了如何執行這個過程(在這個例子中,我們使用隨機梯度下降)。所有優化邏輯都封裝在優化器對象中。這里,我們使用 SGD 優化器; 此外,PyTorch 中還有許多不同的優化器,如 ADAM 和 RMSProp ,它們可以更好地用于不同類型的模型和數據。
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
在訓練的循環中,優化分為3個步驟:
調用 optimizer.zero_grad() 重置模型參數的梯度,默認情況下,梯度是累加的。為了防止重復計算,我們在每次迭代中顯式將他們歸零。
通過調用 loss.backward() 反向傳播預測損失, PyTorch 保存每個參數的損失梯度。
一旦我們有了梯度,我們調用 optimizer.step() 在向后傳遞中收集梯度調整參數。
Full Implementation (完整實現)
我們定義了遍歷優化參數代碼的 train loop, 以及根據測試數據定義了test loop。
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms## 數據集
training_data = datasets.FashionMNIST(root="../../data/",train=True,download=True,transform=transforms.ToTensor()
)test_data = datasets.FashionMNIST(root="../../data/",train=False,download=True,transform=transforms.ToTensor()
)## dataloader
train_dataloader = DataLoader(training_data, batch_size=32, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=32, shuffle=True)## 定義神經網絡
class NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork, self).__init__()self.flatten = nn.Flatten()self.linear_relu_stack = nn.Sequential(nn.Linear(28 * 28, 512),nn.ReLU(),nn.Linear(512, 512),nn.ReLU(),nn.Linear(512, 10))def forward(self, x):out = self.flatten(x)out = self.linear_relu_stack(out)return out## 實例化模型
model = NeuralNetwork()## 損失函數
loss_fn = nn.CrossEntropyLoss()## 優化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)## 超參數
learning_rate = 1e-3
batch_size = 32
epochs = 5## 訓練循環
def train_loop(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset)for batch, (X, y) in enumerate(dataloader):# 計算預測和損失pred = model(X)loss = loss_fn(pred, y)## 反向傳播optimizer.zero_grad()loss.backward()optimizer.step()if batch % 100 == 0:loss, current = loss.item(), batch * len(X)print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")## 測試循環
def test_loop(dataloader, model, loss_fn):size = len(dataloader.dataset)num_batches = len(dataloader)test_loss, correct = 0, 0with torch.no_grad():for X, y in dataloader:pred = model(X)test_loss += loss_fn(pred, y).item()correct += (pred.argmax(1) == y).type(torch.float).sum().item()test_loss /= num_batchescorrect /= sizeprint(f"Test error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f}\n")## 訓練網絡
for t in range(epochs):print(f"Epoch {t+1}\n-------------------------------")train_loop(train_dataloader, model, loss_fn, optimizer)test_loop(test_dataloader, model, loss_fn)
print("Done!")
Lnton羚通專注于音視頻算法、算力、云平臺的高科技人工智能企業。 公司基于視頻分析技術、視頻智能傳輸技術、遠程監測技術以及智能語音融合技術等, 擁有多款可支持ONVIF、RTSP、GB/T28181等多協議、多路數的音視頻智能分析服務器/云平臺。
?