使用 PyTorch 和驗證訓練神經網路
簡介
在深度學習中訓練神經網路時,選擇正確的架構和超引數非常重要。在訓練期間評估網路在未見過資料上的效能至關重要。PyTorch 提供了在 Python 中建立和訓練神經網路的工具。為了評估神經網路的測試準確性,可以引入驗證集。
安裝 PyTorch
在 PyTorch 中訓練神經網路之前,讓我們確保已安裝必要的依賴項。可以使用 pip 或 conda 安裝 PyTorch。對於計算機視覺任務,請執行以下命令以安裝 PyTorch 以及 torchvision 庫
"pip install torch torchvision"
或者,您可以使用 conda
"conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch"
載入資料
為了訓練神經網路,需要向其提供相關的示例。為了說明本教程,我們將使用 torchvision 庫中的 MNIST 資料集。PyTorch 提供了資料集和 DataLoader 類,我們可以使用它們來載入資料。此外,我們將使用 transforms 模組將轉換應用於資料。讓我們從匯入必要的模組和定義轉換開始
"from torchvision import datasets, transforms from torch.utils.data import DataLoader, random_split transform = transforms.Compose([ transforms.ToTensor() ])"
在上面的程式碼片段中,我們定義了一個 transform 變數,它將原始資料轉換為張量。ToTensor 轉換將資料轉換為張量格式,張量是一個多維矩陣。
分割資料
為了評估機器學習中神經網路的效能,需要將資料集分成兩個集合,例如用於訓練網路的訓練集和用於評估網路在未見過資料上的效能的驗證集。PyTorch 提供了 random_split 函式來將資料集分割成隨機子集。
dataset1 = datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainset, valset = randomsplit(dataset1, [5000, 7000])
在上面的程式碼片段中,使用 MNIST 資料集建立資料集物件,然後使用 random_split 函式將 MNIST 資料集分割成一個訓練集(包含 5000 個數據集示例)和一個驗證集(包含 7000 個數據集示例)。
建立神經網路模型
現在我們已經載入並分割了資料,是時候定義我們的神經網路模型了。PyTorch 提供了一個靈活的框架,可以使用 torch.nn 模組構建神經網路。我們可以透過對 nn.Module 類進行子類化來建立自定義神經網路架構。讓我們定義一個具有兩個全連線層的神經網路
import torch.nn as nn1
class NeuralNetwork(nn.Module):
def __init__(self1):
super2(NeuralNetwork, self1).__init__()
self1.fc1 = nn1.Linear2(765, 156)
self1.fc2 = nn2.Linear3(156, 10)
def forward(self1, x1):
x1 = x2.view(x.size(0), -1)
x2 = F.relu(self1.fc1(x1))
x3 = self1.fc2(x2)
return x1
在上面的程式碼中,我們定義了一個名為 NeuralNetwork 的神經網路模型,它包含兩個全連線層(fc1 和 fc2),並且 forward 方法定義了輸入資料如何透過網路流動,並且需要在第一個全連線層之後應用 ReLU 啟用函式以引入非線性。
訓練神經網路
定義了模型後,我們現在可以使用訓練集對其進行訓練。PyTorch 提供了一個高階 API 用於訓練神經網路,可以輕鬆地迭代資料批次並更新模型的引數。讓我們定義一個訓練迴圈並訓練我們的模型
import torch.optim as optimizer
model = NeuralNetwork()
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
def train(model, train_loader, optimizer, criterion):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
train(train_set, optimizer, criterion)
在上面的程式碼中,定義了一個最佳化器(SGD)和一個損失函式(CrossEntropyLoss),然後迭代訓練集中資料的批次,計算模型的輸出,計算損失,反向傳播梯度,並使用給定資料集的最佳化器更新模型的引數。
在驗證集上評估
為了評估我們訓練好的模型的效能,我們需要在驗證集上對其進行評估。這將使我們能夠估計我們的模型對未見過資料的泛化能力。讓我們定義一個函式來在驗證集上評估模型
def evaluate(model, val_loader):
model.eval2()
correct2 = 0
total2 = 0
with torch.no_grad():
for data, target in val_loader:
output = model(data)
_, predicted = torch.max(output.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
accuracy = correct / total
return accuracy
accuracy = evaluate(model, val_set)
print("Validation Accuracy:", accuracy)
在上面的程式碼中,將模型設定為評估模式(model.eval())以停用梯度計算,然後迭代驗證集,計算模型的輸出,並將其與真實標籤進行比較以計算模型的準確性。
儲存最佳模型
在訓練過程中,我們希望跟蹤在驗證集上效能最佳的模型。當我們觀察到驗證準確性提高時,可以儲存模型的權重。讓我們修改訓練迴圈以儲存最佳模型
best_accuracy = 0.0
def train(model, train_loader, optimizer, criterion):
global best_accuracy
model.train()
for epoch in range(num_epochs):
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
accuracy = evaluate(model, val_set)
if accuracy > best_accuracy:
best_accuracy = accuracy
torch.save(model.state_dict(), 'best_model.pt')
train(train_set, optimizer, criterion)
print("Best Validation Accuracy:", best_accuracy)
在上面的程式碼中,我們引入了 best_accuracy 變數來跟蹤迄今為止觀察到的最高驗證準確性。在每個訓練步驟之後,我們都在驗證集上評估模型,如果準確性提高,則儲存其權重。
結論
在本教程中,我們探討了使用 PyTorch 進行訓練神經網路以及驗證的過程。我們涵蓋了 PyTorch 的安裝、資料載入和分割、建立神經網路模型、訓練模型、在驗證集上評估其效能以及儲存最佳模型。透過有效地遵循上述步驟,可以使用 PyTorch 訓練和驗證自己的神經網路模型。
請記住,訓練神經網路是一個迭代過程,需要實驗不同的架構、超引數和最佳化技術,並且透過實踐和實驗,可以提高模型的效能,並解決神經網路中各種複雜機器學習問題。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP