这段代码展示了使用 PyTorch 进行模型训练和评估的完整流程。以下是对代码的详细解释:

  1. 模型初始化
model = models[args.model]()

if torch.cuda.is_available():
    model = model.cuda()
  • 这两行代码首先根据用户指定的模型类型 (args.model) 从 models 字典中加载相应的模型。
  • 然后,代码检查是否有可用的 GPU,如果有,则将模型转移到 GPU 上进行训练。
  1. 优化器和损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5)
# optimizer.load_state_dict(torch.load('save_optim.pt'))
criterion = nn.CrossEntropyLoss()
  • 这部分代码初始化了优化器和损失函数。
  • 优化器采用 Adam 优化器,学习率为 1e-4,权重衰减为 1e-5。
  • 损失函数使用交叉熵损失函数 (CrossEntropyLoss)。
  1. 训练循环
batches_per_epoch = int(len(train_dataset) / args.batch_size)
train_loss_list = []
train_acc_list = []
test_loss_list = []
test_acc_list = []
train_time = 0
model_save_path = './modelpth/'
os.makedirs(model_save_path, exist_ok=True)
for epoch in range(args.epochs):
    tic = time.time()
train_predict = []
train_label = []
runloss = 0
    for (cnt, i) in enumerate(tqdm(train_loader)):
        batch_x = i['data']
        batch_y = i['label']
        batch_x = torch.unsqueeze(batch_x, dim=1)
        batch_x = batch_x.float()
        if torch.cuda.is_available():
            batch_x = batch_x.cuda()
            batch_y = batch_y.cuda()
        tlabels, tpredi, tloss = train(model, batch_x, batch_y, optimizer, criterion)
        runloss = runloss + tloss
        train_label.extend(tlabels)
        train_predict.extend(tpredi)
    per_epoch_train_time = time.time() - tic
    train_time = per_epoch_train_time + train_time
    taccuracy = accuracy_score(train_label, train_predict)
    train_acc_list.append(taccuracy)
    loss = runloss / batches_per_epoch
    train_loss_list.append(loss)
    acc_score, loss_score, feature_list, C = test(model, test_loader, criterion)
    print("Epoch %d Val_accuracy %.3f Val_loss %.3f" % (epoch, acc_score, loss_score))
    with open('log.csv', 'a+')as f:
        f.write(f'{epoch}, {round(acc_score, 4)}, {round(loss_score, 4)}
')
    f.close()
    test_acc_list.append(acc_score)
    test_loss_list.append(loss_score)
    if epoch % 10 == 0:
        torch.save(model, f'./modelpth/{epoch}.pth')
    if epoch == args.epochs - 1:  # 训练到最后一步
        torch.save(model, './modelpth/finalmodel.pth')
        the_model = torch.load('./modelpth/finalmodel.pth')
        acc_score, loss_score, NAR, featucre_list = test(the_model, test_loader, criterion)
        #print("Epoch %d Train_accuracy %.3f Train_loss %.3f Val_accuracy %.3f Val_loss %.3f NAR %.3f " % (epoch, taccuracy, loss, acc_score, loss_score, NAR))
        print(f'Epoch {epoch} Train_accuracy {taccuracy} Train_loss {loss} Val_accuracy {acc_score} Val_loss {loss_score} NAR {NAR}')
        feature_list = feature_list.detach().cpu().numpy()
        np.savetxt('feature_data.csv', feature_list, delimiter=',')  # 保存特征数据
        draw_result(C)
        print('train totally using %.3f seconds ', train_time)
draw(train_acc_list, train_loss_list, test_acc_list, test_loss_list)  
  • 训练循环遍历每个 epoch。
  • 在每个 epoch 中,代码遍历训练数据,计算损失,并使用优化器更新模型参数。
  • 训练完成后,代码评估模型在测试集上的性能,并保存模型和结果。
  1. 评估和保存
acc_score, loss_score, feature_list, C = test(model, test_loader, criterion)
print("Epoch %d Val_accuracy %.3f Val_loss %.3f" % (epoch, acc_score, loss_score))
with open('log.csv', 'a+')as f:
    f.write(f'{epoch}, {round(acc_score, 4)}, {round(loss_score, 4)}
')
f.close()
test_acc_list.append(acc_score)
test_loss_list.append(loss_score)
... # 保存模型和特征数据
  • 这部分代码使用测试集评估模型性能,并保存评估结果和特征数据。
  • test() 函数计算测试集上的准确率、损失、特征数据和混淆矩阵 (C)。
  • 评估结果保存到 log.csv 文件中。
  • 最终模型保存到 ./modelpth/finalmodel.pth 文件中。
  1. 可视化结果
draw(train_acc_list, train_loss_list, test_acc_list, test_loss_list)
  • 这行代码调用 draw() 函数,绘制训练和测试过程中的准确率和损失曲线,以便直观地观察模型的训练效果。

这段代码展示了使用 PyTorch 进行模型训练和评估的典型流程。根据具体的任务和数据集,代码可能需要进行调整和修改。

PyTorch 模型训练和评估代码详解

原文地址: https://www.cveoy.top/t/topic/lavk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录