我编写了两个 DataSet 类(一个 map 样式和一个 iterator 样式)与 DataLoader 一起使用(任何一个都可以,但我只是想自己试验和学习)TEXT 数据。
数据+采样器集成似乎工作正常,我能够“迭代”样本,为我生成一个文本及其相关标签。
所以我的问题和困惑的原因是:如果 DataLoader 返回一个可迭代对象,并且我必须围绕数据构建一个张量(批量大小 x 句子的最大长度 x 句子的数量),我应该在 Tokenizer 之后应用“粘合逻辑”吗?
湾。我将使用 AutoTokenizer 模型(来自 HuggingFace)进行标记化——它是一次处理一个样本还是接受批量?如果是后者,它如何处理标签?
这是DataSet类的地图样式实现的代码
class NewsProducer(Dataset):
def __init__(self, path, filename):
self.data = pd.read_csv(os.path.join(path, filename), delimiter=',', error_bad_lines=False)
def __len__(self):
return (len(self.data))
def __getitem__(self, item):
if torch.is_tensor(item):
item = item.tolist()
news = self.data.loc[item, 'text']
label = self.data.loc[item, 'Label']
return news, label
这是 DataLoader 的 Iterable 样式数据集实现的代码
class IterableNewsProducer(IterableDataset):
def __init__(self, path, filename):
super(IterableNewsProducer).__init__()
self.data = pd.read_csv(os.path.join(path, filename), delimiter=',', error_bad_lines=False)
def datastream(self):
for i in self.data.index:
news = self.data.loc[i,'text']
label = self.data.loc[i, 'Label']
yield from (news, label)
def __iter__(self):
return self.datastream()
这是通过 DataLoader 对数据集的迭代
training_dataset = NewsProducer('data', 'Train.csv')
torch.manual_seed(1)
train_loader = DataLoader(training_dataset, batch_size=10, shuffle=True, num_workers=0)
training_dataset = IterableNewsProducer('data', 'Train.csv')
torch.manual_seed(1)
train_loader = DataLoader(training_dataset, batch_size=50, num_workers=0)
i = 1
for batch in train_loader:
if i == 3:
print(type(batch))
for news in batch:
if isinstance(news, numpy.int64):
print(news)
else:
print(news[:30])
break
i += 1