如何解决确保批次中的所有样本在 pytorch 数据加载器中具有相同的形状
我的任务是使用 pyTorch 和 BERT 对自定义数据集进行多标签分类。我的数据包含大约 1500 个样本。字数可以在 1000 到 50k 字之间变化。因为 BERT 只能处理 512 的最大序列,所以我对我的数据使用了滑动窗口方法。请注意,一个数据样本可以有多个句子。
作为参考,我正在使用示例笔记本 here 和 huggingface。
这是我的脚本的最小版本:
import transformers
from torch.utils.data import Dataset,DataLoader,RandomSampler,SequentialSampler
from transformers import BertTokenizer,BertModel,BertConfig
import pandas as pd
import torch
from torch import cuda
import math
import transformers
from transformers import BertTokenizer,BertConfig,AutoTokenizer
from torch.utils.data import Dataset,SequentialSampler
device = 'cuda' if cuda.is_available() else 'cpu'
MAX_LEN = 400
STRIDE = 20
TRAIN_BATCH_SIZE = 8
VALID_BATCH_SIZE = 4
EPOCHS = 1
LEARNING_RATE = 1e-05
model_checkpoint = "bert-base-german-cased"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint,local_files_only=True)
assert isinstance(tokenizer,transformers.PreTrainedTokenizerFast)
class CustomDataset(Dataset):
def __init__(self,dataframe,tokenizer,max_len,stride):
self.tokenizer = tokenizer
self.data = dataframe
self.text = dataframe.text
self.targets = self.data.labels
self.max_len = max_len
self.stride = stride
def __len__(self):
return len(self.text)
def __getitem__(self,index):
text = str(self.text[index])
text = " ".join(text.split())
inputs = self.tokenizer(
text,None,max_length=MAX_LEN,stride=STRIDE,padding='max_length',truncation='only_first',return_overflowing_tokens=True,)
ids = inputs['input_ids']
mask = inputs['attention_mask']
token_type_ids = inputs["token_type_ids"]
return {
'ids': torch.tensor(ids,dtype=torch.long),'mask': torch.tensor(mask,'token_type_ids': torch.tensor(token_type_ids,'targets': torch.tensor(self.targets[index],dtype=torch.float)
}
我认为滑动窗口可以正常工作,因为如果我运行 [len(x) for x in inputs["input_ids"]]
,我会得到段落/文本的 input_id 列表。
# Creating the dataset and dataloader for the neural network
train_size = 0.8
train_dataset=training_frame.sample(frac=train_size,random_state=200)
test_dataset=training_frame.drop(train_dataset.index).reset_index(drop=True)
train_dataset = train_dataset.reset_index(drop=True)
print("FULL Dataset: {}".format(training_frame.shape))
print("TRAIN Dataset: {}".format(train_dataset.shape))
print("TEST Dataset: {}".format(test_dataset.shape))
training_set = CustomDataset(train_dataset,MAX_LEN,STRIDE)
testing_set = CustomDataset(test_dataset,STRIDE)
train_params = {'batch_size': TRAIN_BATCH_SIZE,'shuffle': False,'num_workers': 0
}
test_params = {'batch_size': VALID_BATCH_SIZE,'shuffle': True,'num_workers': 0
}
training_loader = DataLoader(training_set,**train_params)
testing_loader = DataLoader(testing_set,**test_params)
直到这里脚本运行没有任何错误,但是如果我尝试像这里这样迭代 training_set
:
train_iter = iter(training_loader)
print(type(train_iter))
text,labels = train_iter.next()
print(text.size())
print(labels.size())
我收到以下错误:
RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 133 and 75 in dimension 1 at /opt/conda/conda-bld/pytorch_1556653215914/work/aten/src/TH/generic/THTensor.cpp:711
Process finished with exit code 1
在此 question 中,André 提到加载的批次具有不同的形状,这就是发生此错误的原因。他建议设置batch_size = 1
。但是我想使用在我的脚本中定义的 batch_size
。
我认为滑动窗口会导致错误,因为 input_ids
的列表在我的批次样本中每个样本可能会有所不同,因为文本的总长度可能不同。
我如何确保输入到网络的数据始终具有相同的形状?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。