本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。
原文链接:Kaggle干货:自定义transformers数据集
transformers
是现在NLP同学必备的库,但在使用的过程中主要的代码是需要自定义数据集,那么如何舒服的读取数据,并使用transformers
进行训练模型呢?
本文的内容如下:
-
自定义文本数据集
-
使用
transformers
中trainer
训练 -
使用Pytorch自定义训练流程
步骤1:读取IMDb Reviews
IMDb Reviews是比较常见的英文情感分类的数据集,主要完成文本多分类任务。我们首先需要读取数据,并处理数据。
-
下载数据
# 如下为shell命令
wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
tar -xf aclImdb_v1.tar.gz
-
划分数据集
from sklearn.model_selection import train_test_split
train_texts, val_texts, train_labels, val_labels = train_test_split(train_texts, train_labels, test_size=.2)
-
对文本进行编码
这里建议提前将文本进行编码,不建议动态进行编码,可以节约时间。
from transformers import DistilBertTokenizerFast
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased')
train_encodings = tokenizer(train_texts, truncation=True, padding=True)
val_encodings = tokenizer(val_texts, truncation=True, padding=True)
test_encodings = tokenizer(test_texts, truncation=True, padding=True)
-
自定义数据集
比较常见的自定义数据集的方法,需要修改__init__
、__getitem__
和__len__
函数。
import torch
class IMDbDataset(torch.utils.data.Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item['labels'] = torch.tensor(self.labels[idx])
return item
def __len__(self):
return len(self.labels)
train_dataset = IMDbDataset(train_encodings, train_labels)
val_dataset = IMDbDataset(val_encodings, val_labels)
test_dataset = IMDbDataset(test_encodings, test_labels)
步骤2:使用trainer训练
如果你的数据集定义为上述的格式,就可以非常方面的使用transformers
中trainer
训练。
from transformers import DistilBertForSequenceClassification, Trainer, TrainingArguments
# 训练细节
training_args = TrainingArguments(
output_dir='./results', # output directory
num_train_epochs=3, # total number of training epochs
per_device_train_batch_size=16, # batch size per device during training
per_device_eval_batch_size=64, # batch size for evaluation
warmup_steps=500, # number of warmup steps for learning rate scheduler
weight_decay=0.01, # strength of weight decay
logging_dir='./logs', # directory for storing logs
logging_steps=10,
)
# 加载模型
model = DistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
trainer = Trainer(
model=model, # the instantiated
标签:__,loss,transformers,自定义,self,labels,Kaggle,train
From: https://blog.csdn.net/csdn_xmj/article/details/138021434