就像船長依賴儀器來保持航向一樣,數據科學家需要回調和日志記錄系統來監控和指導他們在PyTorch中的模型訓練。在本教程中,我們將指導您實現回調和日志記錄功能,以成功訓練模型。
回調和日志記錄是PyTorch中有效管理和監控機器學習模型訓練過程的基本工具。
在編程中,回調是一個作為參數傳遞給另一個函數的函數。這允許回調函數在調用函數的特定點執行。在PyTorch中,回調用于在訓練循環的指定階段執行操作,例如一個時期的結束或處理一個批次之后。這些階段可以是:
回調執行的常見操作包括:
日志記錄是指記錄軟件執行過程中發生的事件。PyTorch日志記錄對于監控各種指標至關重要,以理解模型隨時間的性能。存儲訓練指標,如:
日志記錄提供了模型訓練歷程的歷史記錄。它允許您:
讓我們逐步了解如何在PyTorch中實現一個簡單的回調和日志記錄系統。
首先,我們定義一個回調類,它將在每個時期的結束時打印一條消息。
class PrintCallback: def on_epoch_end(self, epoch, logs): print(f"Epoch {epoch}: loss = {logs['loss']:.4f}, accuracy = {logs['accuracy']:.4f}")
接下來,我們修改訓練循環以接受我們的回調,并在每個時期的結束時調用它。
def train_model(model, dataloader, criterion, optimizer, epochs, callbacks): for epoch in range(epochs): for batch in dataloader: # Training process happens here pass logs = {'loss': 0.001, 'accuracy': 0.999} # Example metrics after an epoch for callback in callbacks: callback.on_epoch_end(epoch, logs)
對于日志記錄,我們將使用Python內置的日志模塊來記錄訓練進度。
import logginglogging.basicConfig(level=logging.INFO)def log_metrics(epoch, logs): logging.info(f"Epoch {epoch}: loss = {logs['loss']:.4f}, accuracy = {logs['accuracy']:.4f}")
最后,我們創建我們的回調實例,設置記錄器,并開始訓練過程。
print_callback = PrintCallback()train_model(model, dataloader, criterion, optimizer, epochs=10, callbacks=[print_callback])
讓我們創建一個代表我們機器人繪畫的隨機數字的簡單數據集。我們將使用PyTorch創建隨機數據點。
import torch# Generate random data pointsdata = torch.rand(100, 3) # 100 paintings, 3 colors eachlabels = torch.randint(0, 2, (100,)) # Randomly label them as good (1) or bad (0)
步驟1:定義一個簡單模型
現在,我們將定義一個簡單的模型,嘗試學習對繪畫進行分類。
from torch import nn# A simple neural network with one layerclass SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.layer = nn.Linear(3, 2) def forward(self, x): return self.layer(x)model = SimpleModel()
步驟2:設置訓練
我們將準備訓練模型所需的一切。
# Loss function and optimizercriterion = nn.CrossEntropyLoss()optimizer = torch.optim.SGD(model.parameters(), lr=0.1)# DataLoader to handle our datasetfrom torch.utils.data import TensorDataset, DataLoaderdataset = TensorDataset(data, labels)dataloader = DataLoader(dataset, batch_size=10)
步驟3:實現一個回調
我們將創建一個回調,它在每個時期后打印損失。
class PrintLossCallback: def on_epoch_end(self, epoch, loss): print(f"Epoch {epoch}: loss = {loss:.4f}")
步驟4:使用回調訓練
現在,我們將訓練模型并使用我們的回調。
def train(model, dataloader, criterion, optimizer, epochs, callback): for epoch in range(epochs): total_loss = 0 for inputs, targets in dataloader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() total_loss += loss.item() callback.on_epoch_end(epoch, total_loss / len(dataloader))# Create an instance of our callbackprint_loss_callback = PrintLossCallback()# Start trainingtrain(model, dataloader, criterion, optimizer, epochs=5, callback=print_loss_callback)
輸出:
Epoch 0: loss = 0.6927Epoch 1: loss = 0.6909Epoch 2: loss = 0.6899Epoch 3: loss = 0.6891Epoch 4: loss = 0.6885
步驟5:可視化訓練
我們可以繪制隨時間變化的損失,以可視化我們機器人的進步。
import matplotlib.pyplot as pltlosses = [] # Store the losses hereclass PlotLossCallback: def on_epoch_end(self, epoch, loss): losses.append(loss) plt.plot(losses) plt.xlabel('Epoch') plt.ylabel('Loss') plt.show()# Update our training function to use the plotting callbackplot_loss_callback = PlotLossCallback()train(model, dataloader, criterion, optimizer, epochs=5, callback=plot_loss_callback)
輸出:
對于第二個示例,我們將使用在線可用的真實數據集。我們將直接使用URL加載著名的鳶尾花數據集。
步驟1:加載數據集
我們將使用pandas從URL加載數據集。
import pandas as pd# Load the Iris dataseturl = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"iris_data = pd.read_csv(url, header=None)
步驟2:預處理數據
我們需要將數據轉換為PyTorch可以理解的格式。
from sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import train_test_split# Encode the labelsencoder = LabelEncoder()iris_labels = encoder.fit_transform(iris_data[4])# Split the datatrain_data, test_data, train_labels, test_labels = train_test_split( iris_data.iloc[:, :4].values, iris_labels, test_size=0.2, random_state=42)# Convert to PyTorch tensorstrain_data = torch.tensor(train_data, dtype=torch.float32)test_data = torch.tensor(test_data, dtype=torch.float32)train_labels = torch.tensor(train_labels, dtype=torch.long)test_labels = torch.tensor(test_labels, dtype=torch.long)# Create DataLoaderstrain_dataset = TensorDataset(train_data, train_labels)test_dataset = TensorDataset(test_data, test_labels)train_loader = DataLoader(train_dataset, batch_size=10)test_loader = DataLoader(test_dataset, batch_size=10)
步驟3:為鳶尾花數據集定義一個模型
我們將為鳶尾花數據集創建一個合適的模型。
class IrisModel(nn.Module): def __init__(self): super(IrisModel, self).__init__() self.layer1 = nn.Linear(4, 10) self.layer2 = nn.Linear(10, 3) def forward(self, x): x = torch.relu(self.layer1(x)) return self.layer2(x)iris_model = IrisModel()
步驟4:訓練模型
我們將按照之前的步驟訓練這個模型。
# Assume the same training function and callbacks as beforetrain(iris_model, train_loader, criterion, optimizer, epochs=5, callback=plot_loss_callback)
輸出:
步驟5:評估模型
最后,我們將檢查我們的模型在測試數據上的表現如何。
def evaluate(model, test_loader): model.eval() # Set the model to evaluation mode correct = 0 with torch.no_grad(): # No need to track gradients for inputs, targets in test_loader: outputs = model(inputs) _, predicted = torch.max(outputs, 1) correct += (predicted == targets).sum().item() accuracy = correct / len(test_loader.dataset) print(f"Accuracy: {accuracy:.4f}")evaluate(iris_model, test_loader)
輸出:
Accuracy: 0.3333
您可以通過設置回調和日志記錄來進行必要的調整,獲得對模型訓練過程的洞察,并確保其高效學習。請記住,如果您的模型提供明確反饋,您通往訓練有素的機器學習模型的道路將更加順利。本文提供了適合初學者的代碼示例和解釋,讓您基本掌握PyTorch中的回調和日志記錄。不要猶豫嘗試提供的代碼。記住,實踐是掌握這些主題的關鍵。
本文鏈接:http://www.tebozhan.com/showinfo-26-112766-0.htmlPyTorch中使用回調和日志記錄來監控模型訓練?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com