PyTorch 模型训练和评估代码详解
这段代码展示了使用 PyTorch 进行模型训练和评估的完整流程。以下是对代码的详细解释:
- 模型初始化
model = models[args.model]()
if torch.cuda.is_available():
model = model.cuda()
- 这两行代码首先根据用户指定的模型类型 (args.model) 从 models 字典中加载相应的模型。
- 然后,代码检查是否有可用的 GPU,如果有,则将模型转移到 GPU 上进行训练。
- 优化器和损失函数
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)。
- 训练循环
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 中,代码遍历训练数据,计算损失,并使用优化器更新模型参数。
- 训练完成后,代码评估模型在测试集上的性能,并保存模型和结果。
- 评估和保存
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文件中。
- 可视化结果
draw(train_acc_list, train_loss_list, test_acc_list, test_loss_list)
- 这行代码调用
draw()函数,绘制训练和测试过程中的准确率和损失曲线,以便直观地观察模型的训练效果。
这段代码展示了使用 PyTorch 进行模型训练和评估的典型流程。根据具体的任务和数据集,代码可能需要进行调整和修改。
原文地址: https://www.cveoy.top/t/topic/lavk 著作权归作者所有。请勿转载和采集!