我想运行多个实验,然后报告每个实验的模型准确性。
我正在使用 pytorch (v1.1.0) 训练一个玩具 MNIST 示例,但目标是,一旦我可以比较玩具问题的性能,就将其与实际代码库集成。
据我了解,TRAINS python 包中,“两行代码”已记录我的所有超参数(在我的情况下是命令行 argparse)。
我需要做什么才能报告最终的标量,然后能够对所有不同的训练实验(带有超参数)进行分类以找到最好的一个。
我想要得到的是一张图表,其中 X 轴上有超参数值,Y 轴上有验证准确度。
在 PyTorch 中进行实验管理,并通过 TRAINS(现在被称为 Optuna 或 ClearML)来跟踪超参数和模型的性能,可以非常方便地记录每个实验的准确性,并绘制超参数与性能的关系图。你可以使用 TRAINS 轻松地跟踪实验,并进行超参数调优以找到最佳模型。
首先,确保你已经安装了 TRAINS 和相关的依赖项。可以使用以下命令安装 TRAINS:
bash pip install clearml
然后,你需要在代码中配置 ClearML 来记录每个实验的超参数、损失、准确性等信息。
```python from clearml import Task import argparse import torch import torch.optim as optim import torch.nn as nn from torch.utils.data import DataLoader from torchvision import datasets, transforms
# Step 1: Initialize ClearML task task = Task.init(project_name=”MNIST_Experiment”, task_name=”Training Experiment”, reuse_last_task_id=False)
# Step 2: Argument Parsing (optional) parser = argparse.ArgumentParser(description=”MNIST Experiment”) parser.add_argument(‘–batch_size’, type=int, default=64, help=’Batch size for training’) parser.add_argument(‘–lr’, type=float, default=0.01, help=’Learning rate’) parser.add_argument(‘–epochs’, type=int, default=10, help=’Number of training epochs’) args = parser.parse_args()
# Step 3: Log Hyperparameters task.connect(args)
# Step 4: Define Model, Optimizer, Loss Function model = nn.Sequential( nn.Flatten(), nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 10) )
optimizer = optim.SGD(model.parameters(), lr=args.lr) criterion = nn.CrossEntropyLoss()
# Step 5: Load MNIST Dataset transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) train_data = datasets.MNIST(‘.’, train=True, download=True, transform=transform) train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True)
# Step 6: Train the Model def train(model, criterion, optimizer, train_loader, epochs): model.train() for epoch in range(epochs): total_loss = 0 correct = 0 total = 0 for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step()
total_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total avg_loss = total_loss / len(train_loader) print(f"Epoch {epoch+1}/{epochs}, Loss: {avg_loss}, Accuracy: {accuracy}") # Step 7: Log Metrics task.log_metrics({'accuracy': accuracy, 'loss': avg_loss}, step=epoch)
# Step 8: Run the training process train(model, criterion, optimizer, train_loader, args.epochs) ```
使用 Task.init() 来初始化 ClearML 实验,并指定项目名和任务名。
Task.init()
命令行参数解析:
使用 argparse 来解析超参数(如批量大小 batch_size、学习率 lr、训练周期数 epochs),并将其连接到 ClearML,以便跟踪。
argparse
batch_size
lr
epochs
超参数日志:
使用 task.connect(args) 将超参数与 ClearML 实验进行关联,并自动记录这些超参数。
task.connect(args)
训练模型:
torch.optim.SGD
torch.nn.CrossEntropyLoss
task.log_metrics()
一旦实验完成,你可以在 ClearML 仪表盘中查看所有实验,并比较不同的超参数配置对模型性能的影响。
在 ClearML 仪表盘中,你可以选择多个实验,然后在图表中绘制出不同超参数与模型验证准确度的关系图。
MNIST_Experiment
选择多个实验并查看不同超参数与 accuracy 或 loss 的关系。
accuracy
loss
可视化超参数:
如果你有很多超参数,并希望自动化超参数调优,可以使用 Optuna(ClearML 支持 Optuna 作为超参数优化框架)。通过这种方式,你可以自动搜索最佳的超参数组合。
import optuna from clearml import Task def objective(trial): task = Task.init(project_name="MNIST_Experiment", task_name="Hyperparameter Optimization", reuse_last_task_id=False) # Define hyperparameters to optimize batch_size = trial.suggest_int('batch_size', 32, 128) lr = trial.suggest_loguniform('lr', 1e-5, 1e-1) epochs = 10 # Define model, optimizer, and training loop (similar to previous code) model = nn.Sequential( nn.Flatten(), nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 10) ) optimizer = optim.SGD(model.parameters(), lr=lr) criterion = nn.CrossEntropyLoss() # Load data, train model, and evaluate accuracy as before accuracy = 0.85 # Example, replace with actual accuracy after training task.log_metrics({'accuracy': accuracy}) return accuracy # Create an Optuna study and optimize the objective function study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=10) # Retrieve the best parameters print(study.best_params)
通过 ClearML,你可以轻松地记录和比较不同实验的超参数和模型性能(如准确度)。你可以通过 ClearML 仪表盘直观地查看每个实验的超参数和准确度,并选择最佳的模型配置。 还可以通过 Optuna 来自动化超参数优化,提高模型的性能。