PyTorch中交叉熵损失函数的超参数调优方法
发布时间:2023-12-31 12:39:42
在PyTorch中,交叉熵损失函数通常与Softmax函数一起使用,用于多分类任务。超参数调优是为了选择 的超参数组合,以提高模型的性能和准确性。下面将介绍一种常用的交叉熵损失函数的超参数调优方法,并提供一个使用例子。
超参数调优方法:
1. 网格搜索:通过遍历一系列预定义的超参数组合,计算模型在验证集上的性能指标,并选择性能 的超参数组合。这种方法适用于超参数空间较小的情况。
使用例子:
假设我们要通过调优超参数来改善一个用于手写数字识别的模型。超参数包括学习率、批处理大小和隐藏层大小(神经元数量)。
首先,加载数据集和定义模型:
import torch
import torch.nn as nn
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 加载数据集
train_dataset = datasets.MNIST(root='data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='data', train=False, transform=transforms.ToTensor())
# 定义模型
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
out = self.softmax(out)
return out
input_size = 28*28 # 输入图像的大小
hidden_size = [128, 256, 512] # 隐藏层的神经元数量的候选值
num_classes = 10 # 类别数量
# 创建模型实例
model = NeuralNet(input_size, hidden_size, num_classes)
接下来,定义超参数搜索空间和评估函数,执行网格搜索:
import itertools
learning_rates = [0.001, 0.01, 0.1] # 学习率的候选值
batch_sizes = [16, 32, 64] # 批处理大小的候选值
# 定义评估函数,返回模型在验证集上的准确率
def evaluate(model, val_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in val_loader:
images = images.reshape(-1, input_size).to(device)
labels = labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
return (100 * correct) / total
# 网格搜索
best_accuracy = 0
best_lr = None
best_bs = None
best_hs = None
for lr, bs, hs in itertools.product(learning_rates, batch_sizes, hidden_size):
model = NeuralNet(input_size, hs, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9)
# 训练模型
for epoch in range(num_epochs):
for images, labels in train_loader:
images = images.reshape(-1, input_size).to(device)
labels = labels.to(device)
# 正向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 计算验证集准确率
accuracy = evaluate(model, val_loader)
# 保存最优超参数组合
if accuracy > best_accuracy:
best_accuracy = accuracy
best_lr = lr
best_bs = bs
best_hs = hs
# 输出最优超参数组合
print("Best hyperparameters:")
print("Learning rate:", best_lr)
print("Batch size:", best_bs)
print("Hidden size:", best_hs)
使用以上方法可以通过网格搜索找到 的超参数组合,从而提高模型的性能和准确性。请注意,由于不同问题的性质不同,超参数的选择可能会有所不同,因此需要根据具体问题进行调整。
