【NLP实战】基于Bert和双向LSTM的情感分类【中篇】

文章目录需要导入的包和说明第一部分:搭建整体结构 Step5:前置工作:将进行one-:测试 第二部分:转移至GPU 第三部分:!改造结构 第四部分:正式训练
前言
本文涉及的代码全由博主自己完成,可以随意拿去做参考 。如对代码有不懂的地方请联系博主 。
博主page:issey的博客 - 愿无岁月可回首
本系列文章中不会说明环境和包如何安装,这些应该是最基础的东西,可以自己边查边安装 。
许多函数用法等在代码里有详细解释,但还是希望各位去看它们的官方文档,我的代码还有很多可以改进的方法,需要的函数等在官方文档都有说明 。
简介
本系列将带领大家从数据获取、数据清洗,模型构建、训练,观察loss变化,调整超参数再次训练,并最后进行评估整一个过程 。我们将获取一份公开竞赛中文数据,并一步步实验,到最后,我们的评估可以达到排行榜13位的位置 。但重要的不是排名,而是我们能在其中学到很多 。
本系列共分为三篇文章,分别是:
本文为该系列第二篇文章,在本文中,我们将学习如何用搭建我们需要的神经网络,如何用 改造我们的,并开始在GPU环境我们第一次正式的训练 。在这篇文章的末尾,我们的模型在测试集上的表现将达到排行榜28名的位置 。
注意:本文不会写到训练好的模型读取与测试集测试,这将在下一篇文章详细说明 。
模型、优化器与损失函数选择 神经网络的整体结构优化器选择
选择AdamW作为本次训练的优化器 。
关于SGD,,Adam优化器,在斋藤康毅的《深度学习入门:基于的理论和实现》中有详细说明 。AdamW是Adam的改进版本之一 。
损失函数选择
选择CrossLoss作为损失函数 。CrossLoss实际上包含了层的实现 。这里不进行展开讨论 。关于CrossLoss的详细实现也在《深度学习入门》一书中有详细说明 。
需要导入的包和说明
import torchfrom datasets import load_dataset# hugging-face datasetfrom torch.utils.data import Datasetfrom torch.utils.data import DataLoaderimport torch.nn as nnfrom transformers import BertTokenizer, BertModelimport torch.optim as optimfrom torch.nn.functional import one_hotimport pytorch_lightning as plfrom pytorch_lightning import Trainerfrom torchmetrics.functional import accuracy, recall, precision, f1_score# lightning中的评估from pytorch_lightning.callbacks.early_stopping import EarlyStoppingfrom pytorch_lightning.callbacks import ModelCheckpoint
说明:
需要加载的数据与模型
现在,让我们开始写代码吧!
第一部分:搭建整体结构 step1: 定义,加载数据
框架第一步:自定义数据集 。如果这个有疑问,需要去看看基础 。
import torchfrom datasets import load_dataset# hugging-face datasetfrom torch.utils.data import Datasetfrom torch.utils.data import DataLoaderimport torch.nn as nn# 自定义数据集class MydataSet(Dataset):def __init__(self, path, split):self.dataset = load_dataset('csv', data_files=path, split=split)def __getitem__(self, item):text = self.dataset[item]['text']label = self.dataset[item]['label']return text, labeldef __len__(self):return len(self.dataset)if __name__ == '__main__':# load train datatrain_dataset = MydataSet('./data/archive/train_clean.csv', 'train')print(train_dataset.__len__())print(train_dataset[0])
解释一下中的split,他是分割文档的意思,但是我们这里是从本地读取csv,文件格式并不是 face 的标准 。所以之后无论是验证集还是测试集,我们都统一填'train' 。更多详情请访问官方文档 。