0

我编写了两个 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
4

0 回答 0