深度學習和理解訓練過程中的學習和進步機制對于優化性能、診斷欠擬合或過擬合等問題至關重要。將訓練過程可視化的過程為學習的動態提供了有價值的見解,使我們能夠做出合理的決策。訓練進度必須可視化的兩種方法是:使用Matplotlib和Tensor Board。在本文中,我們將學習如何在Pytorch中可視化模型訓練進度。
使用Matplotlib在PyTorch中可視化訓練進度
Matplotlib是Python中廣泛使用的繪圖庫,它為在Python中創建靜態,動畫和交互式可視化提供了靈活而強大的工具。它特別適合于創建出版質量的圖表。
**步驟1:**導入必要的庫并生成樣本數據集
在這一步中,我們將導入必要的庫并生成樣本數據集。
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# Sample data
X = torch.randn(100, 1) # Sample features
y = 3 * X + 2 + torch.randn(100, 1) # Sample labels with noise
**步驟2:**定義模型
- PyTorch中的
LinearRegression
類定義了一個簡單的線性回歸模型。它繼承自nn。模塊的類,使其成為一個神經網絡模型。 - 構造函數(
__init__
方法)初始化模型的結構,創建具有一個輸入特征和一個輸出特征的單一線性層(‘nn.Linear’)。 - 這個線性層被存儲為名為
self.linear
的屬性。“forward”方法定義了如何通過這個線性層處理輸入數據“x”以產生模型的輸出。 - 具體來說,輸入
x
是通過self.linear
,并返回結果輸出。該方法封裝了神經網絡的前向傳遞計算,決定了模型如何將輸入轉換為輸出。
# Define a simple linear regression model
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(1, 1) # One input feature, one outputdef forward(self, x):return self.linear(x)model = LinearRegression()
**步驟3:**定義損失函數、優化器和訓練循環
在下面的代碼中,我們將均方誤差定義為損失函數,將隨機梯度下降(SGD)優化器定義為優化器,該優化器通過使用學習率為0.01的計算梯度來修改模型的參數。
# Define loss function and optimizer
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
這段代碼運行了一個神經網絡模型在多個時代的訓練循環,使用梯度下降計算和優化損失。損失值被存儲以進行繪圖,進度每10次打印一次。
# Training loop
num_epochs = 100
losses = []
for epoch in range(num_epochs):# Forward passoutputs = model(X)loss = criterion(outputs, y)# Backward pass and optimizationoptimizer.zero_grad()loss.backward()optimizer.step()# Print progressif (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')# Store loss for plottinglosses.append(loss.item())
**步驟4:**使用Matplotlib在PyTorch中可視化訓練進度
使用下面的代碼,我們可以使用matplotlib可視化訓練損失曲線。
- plot(損失)線根據epoch號繪制存儲在損失列表中的損失值。
- x軸表示歷元數,y軸表示相應的損失值。
- plt.xlabel(‘Epoch’), plt.ylabel(‘Loss‘)和plt.xlabel(’Epoch’).title()‘Training Loss’)行設置情節的標簽和標題。
- 最后,plot .show()顯示該圖,允許您可視化地分析損失如何在訓練期間減少(或收斂)。
# Plot the loss curve
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()
通常,您會期望在損失曲線中看到下降的趨勢,這表明模型正在隨著時間的推移而學習和改進。
完整的代碼:
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt# Sample data
X = torch.randn(100, 1) # Sample features
y = 3 * X + 2 + torch.randn(100, 1) # Sample labels with noise# Define a simple linear regression model
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(1, 1) # One input feature, one outputdef forward(self, x):return self.linear(x)model = LinearRegression()# Define loss function and optimizer
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# Training loop
num_epochs = 100
losses = []
for epoch in range(num_epochs):# Forward passoutputs = model(X)loss = criterion(outputs, y)# Backward pass and optimizationoptimizer.zero_grad()loss.backward()optimizer.step()# Print progressif (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')# Store loss for plottinglosses.append(loss.item())# Plot the loss curve
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()
輸出圖顯示了訓練損失如何隨時間變化,并根據迭代次數繪制。這種可視化使人們能夠看到模型在訓練時是如何減少損失的。此外,Matplotlib圖還有其他東西,如軸標簽、標題,可能還有標記或線條,表示特定事件,如最小實現損失或損失急劇下降。
使用TensorBoard可視化訓練進度
為了在深度學習模型中可視化訓練過程,我們可以使用torch.utils.tensorboard模塊中的SummaryWriter類,該模塊與TensorFlow開發的可視化工具TensorBoard無縫集成。
- 集成:PyTorch在torch.utils.tensorboard模塊中提供了一個SummaryWriter類,它與TensorBoard無縫集成以實現可視化。
- 日志記錄:在訓練循環中,您可以使用SummaryWriter記錄各種指標,如損失,準確性等,以實現可視化。
- 可視化:TensorBoard提供了記錄指標的交互式和實時可視化,允許您動態監控訓練進度。
- 監控:TensorBoard使您能夠監控訓練的多個方面,例如學習曲線,模型圖和權重直方圖,為優化您的模型提供見解。
使用以下命令安裝TensorBoard庫:
pip install tensorboard
步驟1:導入庫
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
步驟2:定義簡單的神經網絡
讓我們定義SimpleNN一個簡單神經網絡的類聲明,它包含兩個完全連接的層,以及定義網絡前向傳遞的forward函數。
# Define a simple neural network
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(784, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = torch.flatten(x, 1)x = torch.relu(self.fc1(x))x = self.fc2(x)return x
步驟3:加載MNIST數據集
讓我們加載用于訓練的MINST數據,將其分成批次并使用一些預處理技術進行轉換。
# Load a smaller subset of MNIST dataset
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
small_train_dataset = torch.utils.data.Subset(train_dataset, range(1000)) # Subset of first 1000 samples
train_loader = DataLoader(small_train_dataset, batch_size=64, shuffle=True)
步驟4:初始化模型、損失函數和優化器
現在,初始化模型。與此同時,我們將使用交叉熵損失函數和adam優化器來更新模型參數。
# Initialize model, loss function, and optimizer
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
步驟5:初始化用于日志記錄的SummaryWriter
SummaryWriter是導入模塊的對象,用于編寫要在TensorBoard中可視化的日志。
# Initialize SummaryWriter for logging
writer = SummaryWriter('logs_small')
第六步:循環訓練
- 訓練循環:通過時代和批次,執行向前傳遞,計算損失,向后傳遞和更新模型參數。
- 日志損失和準確性:記錄劃時代的訓練損失和準確性。
# Training loop
epochs = 5
for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for i, (inputs, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()# Calculate accuracy_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()# Log losswriter.add_scalar('Loss/train', loss.item(), epoch * len(train_loader) + i)# Log accuracyaccuracy = 100 * correct / totalwriter.add_scalar('Accuracy/train', accuracy, epoch)print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss / len(train_loader)}, Accuracy: {accuracy}%')print('Finished Training')
writer.close()
完整代碼:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter# Define a simple neural network
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(784, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = torch.flatten(x, 1)x = torch.relu(self.fc1(x))x = self.fc2(x)return x# Load a smaller subset of MNIST dataset
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
small_train_dataset = torch.utils.data.Subset(train_dataset, range(1000)) # Subset of first 1000 samples
train_loader = DataLoader(small_train_dataset, batch_size=64, shuffle=True)# Initialize model, loss function, and optimizer
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# Initialize SummaryWriter for logging
writer = SummaryWriter('logs_small')# Training loop
epochs = 5
for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for i, (inputs, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()# Calculate accuracy_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()# Log losswriter.add_scalar('Loss/train', loss.item(), epoch * len(train_loader) + i)# Log accuracyaccuracy = 100 * correct / totalwriter.add_scalar('Accuracy/train', accuracy, epoch)print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss / len(train_loader)}, Accuracy: {accuracy}%')print('Finished Training')
writer.close()
運行示例,輸出如下:
Epoch [1/5], Loss: 1.8145772516727448, Accuracy: 47.1%
Epoch [2/5], Loss: 1.0121613591909409, Accuracy: 78.8%
Epoch [3/5], Loss: 0.6829517856240273, Accuracy: 84.1%
Epoch [4/5], Loss: 0.5442189555615187, Accuracy: 85.4%
Epoch [5/5], Loss: 0.46599634923040867, Accuracy: 87.0%
Finished Training
TensorBoard提供了一個基于web的儀表板,其中包含代表各種培訓方面的選項卡和可視化。標量度量將損失或準確度等值可視化,為訓練動態提供了不同的視角。此外,TensorBoard可以顯示直方圖、嵌入和基于日志信息的專門可視化。
在PyTorch中可視化訓練進度
為了運行TensorBoard,你應該打開終端,然后運行tensorboard use命令:
tensorboard --logdir=./logs_small
注意,這里logdir指定上節示例的路徑,采用相對路徑表示。訪問TensorBoard需要:打開瀏覽器,輸入TensorBoard提供的網址(通常為http://localhost:6006/)。
![]() | |
![]() | |
TensorBoard提供了一個基于web的儀表板,其中包含代表各種培訓方面的選項卡和可視化。標量度量將損失或準確度等值可視化,為訓練動態提供了不同的視角。此外,TensorBoard可以顯示直方圖、嵌入和基于日志信息的專門可視化。
在這篇博客中,我們介紹了如何使用matplotlib和tensorboard來可視化深度學習框架的訓練過程。