PyTorch 模型训练代码:实现 BERT 训练流程和可视化
"""\n"""\n\n\ndef 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)\n"""\n
原文地址: https://www.cveoy.top/t/topic/poS8 著作权归作者所有。请勿转载和采集!