每天五分钟机器学习算法模型实战:预训练xlnet模型完成文本分类
作者头像
  • 互联网之家
  • 2020-05-12 11:27:32 4

以下是改写后的文章内容:


导入所需库

为了实现文本分类任务,我们首先需要导入一些必要的库。这些库包括PyTorch、Keras、sklearn以及pytorch_transformers。

python import torch from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler from keras.preprocessing.sequence import pad_sequences from sklearn.model_selection import train_test_split from pytorch_transformers import XLNetModel, XLNetTokenizer, XLNetForSequenceClassification from pytorch_transformers import AdamW import pandas as pd import numpy as np

安装依赖库

确保安装了所有必需的库,特别是pytorch-transformers,这可以通过以下命令完成:

shell pip install pytorch-transformers

数据集格式

我们的数据集包含四列,但我们只需要第二列(文本标签)和第四列(文本本身)。这些数据将用于训练我们的模型。

读取数据

使用Pandas库可以方便地读取CSV文件中的文本数据。我们将CSV文件中的每一列命名,并提取出文本和标签。

python df = pd.read_csv("in_domain_train.tsv", delimiter='t', header=None, names=['source', 'label', 'notes', 'text']) texts = df.text.values labels = df.label.values

构建数据格式

XLNet模型需要特定的输入格式,因此我们需要对文本进行转换,使其符合模型的要求。具体来说,我们需要在每个文本后添加特定的标记。

python sentences = [text + " [SEP] [CLS]" for text in texts] tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased', do_lower_case=True) tokenized_texts = [tokenizer.tokenize(sent) for sent in sentences] input_ids = [tokenizer.convert_tokens_to_ids(x) for x in tokenized_texts]

文本补齐

由于文本长度各不相同,我们需要对它们进行补齐或截断,以确保所有输入具有相同的长度。

python MAX_LEN = 25 input_ids = pad_sequences(input_ids, maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")

准备注意力掩码

注意力掩码用于标记哪些部分是填充的,哪些是实际的文本内容。

python attention_masks = [] for seq in input_ids: seq_mask = [float(i > 0) for i in seq] attention_masks.append(seq_mask)

数据分割

我们将数据分为训练集和验证集,以便评估模型性能。

```python traininputs, validationinputs, trainlabels, validationlabels = traintestsplit(inputids, labels, randomstate=2019, testsize=0.1) trainmasks, validationmasks, _, _ = traintestsplit(attentionmasks, inputids, randomstate=2019, test_size=0.1)

traininputs = torch.tensor(traininputs) validationinputs = torch.tensor(validationinputs) trainlabels = torch.tensor(trainlabels) validationlabels = torch.tensor(validationlabels) trainmasks = torch.tensor(trainmasks) validationmasks = torch.tensor(validationmasks) ```

生成DataLoader

为了高效地批量处理数据,我们创建了DataLoader对象。

```python batchsize = 32 traindata = TensorDataset(traininputs, trainmasks, trainlabels) trainsampler = RandomSampler(traindata) traindataloader = DataLoader(traindata, sampler=trainsampler, batchsize=batchsize)

validationdata = TensorDataset(validationinputs, validationmasks, validationlabels) validationsampler = SequentialSampler(validationdata) validationdataloader = DataLoader(validationdata, sampler=validationsampler, batchsize=batch_size) ```

初始化模型

我们使用预训练的XLNet模型作为基础模型,并对其进行微调以适应我们的任务。

python model = XLNetForSequenceClassification.from_pretrained("xlnet-base-cased", num_labels=2)

定义优化器

为了训练模型,我们需要定义一个优化器。这里我们选择AdamW优化器,并设置相应的超参数。

python param_optimizer = list(model.named_parameters()) no_decay = ['bias', 'gamma', 'beta'] optimizer_grouped_parameters = [ {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay_rate': 0.01}, {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay_rate': 0.0} ] optimizer = AdamW(optimizer_grouped_parameters, lr=2e-5)

训练模型

最后一步是训练模型。通过迭代训练数据并评估验证集上的性能,我们可以逐步优化模型。

```python

开始训练循环

```

以上步骤涵盖了从数据准备到模型训练的整个流程,确保每个阶段都清晰明了。

    本文来源:图灵汇
责任编辑: : 互联网之家
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
模型算法实战文本机器分钟训练每天完成学习
    下一篇