如何将代码分成 pytorch cnn 的 train、val 和 test 函数?
How to seperate code into train, val and test functions for pytorch cnn?
我正在使用 pytorch 训练 cnn 并创建了一个训练循环。当我执行优化和试验超参数调整时,我想将我的训练、验证和测试分成不同的函数。我需要能够记录每个函数的准确性和损失,以便绘制图表。为此,我想创建一个 returns 精度的函数。
我对编码还很陌生,想知道解决这个问题的最佳方法。我觉得我的代码现在有点乱。我需要能够输入各种超参数以在我的训练函数中进行实验。谁能提供任何建议?以下是我目前所能做的:
def train_model(model, optimizer, data_loader, num_epochs, criterion=criterion):
total_epochs = notebook.tqdm(range(num_epochs))
for epoch in total_epochs:
model.train()
train_correct = 0.0
train_running_loss=0.0
train_total=0.0
for i, (img, label) in enumerate(data_loader['train']):
#uploading images and labels to GPU
img = img.to(device)
label = label.to(device)
#training model
outputs = model(img)
#computing losss
loss = criterion(outputs, label)
#propagating the loss backwards
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_running_loss += loss.item()
_, predicted = outputs.max(1)
train_total += label.size(0)
train_correct += predicted.eq(label).sum().item()
train_loss=train_running_loss/len(data_loader['train'])
train_accu=100.*correct/total
print('Train Loss: %.3f | Train Accuracy: %.3f'%(train_loss,train_accu))
我也尝试过制作一个函数来记录准确度:
def accuracy(outputs, labels):
_, preds = torch.max(outputs, dim = 1)
return torch.tensor(torch.sum(preds == labels).item() / len(preds))
首先,请注意:
- 除非您有某些特定的动机,否则应该在与训练集不同的数据集上执行验证(和测试),因此您应该使用不同的
DataLoader
。由于每个 epoch 都有一个额外的 for 循环,因此计算时间会增加。
- 总是在 validation/testing 之前调用
model.eval()
。
也就是说,验证函数的签名与 train_model
的签名非常相似
# criterion is passed if you want to register the validation loss too
def validate_model(model, eval_loader, criterion):
...
然后,在train_model
中,在每个纪元之后,您可以调用函数validate_model
并将返回的指标存储在某个数据结构中(list
,tensor
,等),稍后将用于绘图。
训练结束后,您可以使用相同的validate_model
函数进行测试。
您可以使用 TorchMetrics
中的 Accuracy
而不是自己编码准确性
最后,如果你觉得需要升级,可以使用像PyTorch Lightning or FastAI. Give also a look at some hyperparameter tuning library such as Ray Tune这样的深度学习训练框架。
我正在使用 pytorch 训练 cnn 并创建了一个训练循环。当我执行优化和试验超参数调整时,我想将我的训练、验证和测试分成不同的函数。我需要能够记录每个函数的准确性和损失,以便绘制图表。为此,我想创建一个 returns 精度的函数。
我对编码还很陌生,想知道解决这个问题的最佳方法。我觉得我的代码现在有点乱。我需要能够输入各种超参数以在我的训练函数中进行实验。谁能提供任何建议?以下是我目前所能做的:
def train_model(model, optimizer, data_loader, num_epochs, criterion=criterion):
total_epochs = notebook.tqdm(range(num_epochs))
for epoch in total_epochs:
model.train()
train_correct = 0.0
train_running_loss=0.0
train_total=0.0
for i, (img, label) in enumerate(data_loader['train']):
#uploading images and labels to GPU
img = img.to(device)
label = label.to(device)
#training model
outputs = model(img)
#computing losss
loss = criterion(outputs, label)
#propagating the loss backwards
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_running_loss += loss.item()
_, predicted = outputs.max(1)
train_total += label.size(0)
train_correct += predicted.eq(label).sum().item()
train_loss=train_running_loss/len(data_loader['train'])
train_accu=100.*correct/total
print('Train Loss: %.3f | Train Accuracy: %.3f'%(train_loss,train_accu))
我也尝试过制作一个函数来记录准确度:
def accuracy(outputs, labels):
_, preds = torch.max(outputs, dim = 1)
return torch.tensor(torch.sum(preds == labels).item() / len(preds))
首先,请注意:
- 除非您有某些特定的动机,否则应该在与训练集不同的数据集上执行验证(和测试),因此您应该使用不同的
DataLoader
。由于每个 epoch 都有一个额外的 for 循环,因此计算时间会增加。 - 总是在 validation/testing 之前调用
model.eval()
。
也就是说,验证函数的签名与 train_model
# criterion is passed if you want to register the validation loss too
def validate_model(model, eval_loader, criterion):
...
然后,在train_model
中,在每个纪元之后,您可以调用函数validate_model
并将返回的指标存储在某个数据结构中(list
,tensor
,等),稍后将用于绘图。
训练结束后,您可以使用相同的validate_model
函数进行测试。
您可以使用 TorchMetrics
中的Accuracy
而不是自己编码准确性
最后,如果你觉得需要升级,可以使用像PyTorch Lightning or FastAI. Give also a look at some hyperparameter tuning library such as Ray Tune这样的深度学习训练框架。