{/'title/':/'这是我的代码//n/',/'description/':/'本代码使用PyTorch框架实现模型训练,并包括优化器、评估函数、损失可视化等功能,帮助您更好地理解模型训练过程。/',/'keywords/':/'PyTorch, 模型训练, 优化器, 评估, 损失可视化, 准确率, 误差, BertAdam, cross-entropy, accuracy_score, matplotlib/',/'content/':/'def train(config, model, train_iter, dev_iter, test_iter)://n start_time = time.time()//n model.train()//n param_optimizer = list(model.named_parameters())//n no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']//n optimizer_grouped_parameters = [//n {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01},//n {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}]//n # optimizer = torch.optim.Adam(model.parameters(), lr=config.learning_rate)//n optimizer = BertAdam(optimizer_grouped_parameters,//n lr=config.learning_rate,//n warmup=0.05,//n t_total=len(train_iter) * config.num_epochs)//n//n total_batch = 0 # 记录进行到多少batch//n dev_best_loss = float('inf')//n last_improve = 0 # 记录上次验证集loss下降的batch数//n flag = False # 记录是否很久没有效果提升//n model.train()//n //n dev_acc_list = []//n dev_loss_list = [] # 保存每个验证集损失值//n//n for epoch in range(config.num_epochs)://n print('Epoch [{}/{}]'.format(epoch + 1, config.num_epochs))//n for i, (trains, labels) in enumerate(train_iter)://n outputs = model(trains)//n model.zero_grad()//n loss = F.cross_entropy(outputs, labels)//n loss.backward()//n optimizer.step()//n if total_batch % 100 == 0://n # 每多少轮输出在训练集和验证集上的效果//n//n//n true = labels.data.cpu()//n predic = torch.max(outputs.data, 1)[1].cpu()//n train_acc = metrics.accuracy_score(true, predic)//n dev_acc, dev_loss = evaluate(config, model, dev_iter)//n//n dev_acc_list.append(dev_acc.item())//n dev_loss_list.append(dev_loss.item()) # 保存当前验证集损失值//n if dev_loss < dev_best_loss://n dev_best_loss = dev_loss//n torch.save(model.state_dict(), config.save_path)//n improve = '*'//n last_improve = total_batch//n else://n improve = ''//n time_dif = get_time_dif(start_time)//n msg = 'Iter: {0:>6}, Train Loss: {1:>5.2}, Train Acc: {2:>6.2%}, Val Loss: {3:>5.2}, ' //n 'Val Acc: {4:>6.2%}, Time: {5} {6}'//n print(msg.format(total_batch, loss.item(), train_acc, dev_loss, dev_acc, time_dif, improve))//n model.train()//n total_batch += 1//n if total_batch - last_improve > config.require_improvement://n # 验证集loss超过1000batch没下降,结束训练//n print(/'No optimization for a long time, auto-stopping.../')//n flag = True//n break//n if flag://n break//n //n # 将损失列表转换为NumPy数组//n dev_acc_array = np.array(dev_acc_list)//n dev_loss_array = np.array(dev_loss_list)//n //n # 绘制准确率曲线图//n plt.figure() # 创建新的图像窗口//n plt.plot(dev_acc_array, label='pred_acc', color='darkorange')//n plt.xlabel('Iters')//n plt.ylabel('Accuracy')//n plt.legend()//n plt.show()//n//n # 绘制误差曲线图//n plt.figure() # 创建新的图像窗口//n # plt.plot(train_loss_array, label='train_loss', color='limegreen')//n plt.plot(dev_loss_array, label='pred_loss', color='darkorange')//n plt.xlabel('Iters')//n plt.ylabel('Loss')//n plt.legend()//n plt.show()//n//n test(config, model, test_iter)/


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

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