小能豆

有没有办法用 TRAINS python 包创建一个比较超参数与模型准确度的图表?

py

我想运行多个实验,然后报告每个实验的模型准确性。

我正在使用 pytorch (v1.1.0) 训练一个玩具 MNIST 示例,但目标是,一旦我可以比较玩具问题的性能,就将其与实际代码库集成。

据我了解,TRAINS python 包中,“两行代码”已记录我的所有超参数(在我的情况下是命令行 argparse)。

我需要做什么才能报告最终的标量,然后能够对所有不同的训练实验(带有超参数)进行分类以找到最好的一个。

我想要得到的是一张图表,其中 X 轴上有超参数值,Y 轴上有验证准确度。


阅读 26

收藏
2024-12-26

共1个答案

小能豆

在 PyTorch 中进行实验管理,并通过 TRAINS(现在被称为 OptunaClearML)来跟踪超参数和模型的性能,可以非常方便地记录每个实验的准确性,并绘制超参数与性能的关系图。你可以使用 TRAINS 轻松地跟踪实验,并进行超参数调优以找到最佳模型。

步骤:

  1. 安装和配置 TRAINS(ClearML)

首先,确保你已经安装了 TRAINS 和相关的依赖项。可以使用以下命令安装 TRAINS:

bash pip install clearml

  1. 配置 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)
```

代码说明

  1. 初始化 ClearML 任务:
  2. 使用 Task.init() 来初始化 ClearML 实验,并指定项目名和任务名。

  3. 命令行参数解析:

  4. 使用 argparse 来解析超参数(如批量大小 batch_size、学习率 lr、训练周期数 epochs),并将其连接到 ClearML,以便跟踪。

  5. 超参数日志:

  6. 使用 task.connect(args) 将超参数与 ClearML 实验进行关联,并自动记录这些超参数。

  7. 训练模型:

  8. 定义一个简单的全连接神经网络(MLP),并使用 torch.optim.SGDtorch.nn.CrossEntropyLoss 作为优化器和损失函数。
  9. 在训练过程中,每个周期的损失和准确度都会被记录,并使用 task.log_metrics() 将它们存储到 ClearML。

3. 可视化实验结果

一旦实验完成,你可以在 ClearML 仪表盘中查看所有实验,并比较不同的超参数配置对模型性能的影响。

生成图表

在 ClearML 仪表盘中,你可以选择多个实验,然后在图表中绘制出不同超参数与模型验证准确度的关系图。

  1. 查看实验
  2. 进入 ClearML Dashboard
  3. 找到你的项目 MNIST_Experiment,查看所有实验。
  4. 选择多个实验并查看不同超参数与 accuracyloss 的关系。

  5. 可视化超参数

  6. 在 ClearML 仪表盘中,你可以选择你希望绘制的超参数(例如 lrbatch_size),然后将它们与 accuracy 或其他评估指标进行比较。
  7. ClearML 会自动为你绘制出图表,可以直观地看到哪些超参数配置表现最好。

4. 优化超参数

如果你有很多超参数,并希望自动化超参数调优,可以使用 Optuna(ClearML 支持 Optuna 作为超参数优化框架)。通过这种方式,你可以自动搜索最佳的超参数组合。

使用 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 来自动化超参数优化,提高模型的性能。

2024-12-26