【问题标题】:Pytorch dataloader for sentences用于句子的 Pytorch 数据加载器
【发布时间】:2020-05-15 04:49:20
【问题描述】:

我收集了一个用于二进制文本分类的小数据集,我的目标是用Convolutional Neural Networks for Sentence Classification提出的方法训练一个模型

我使用torch.util.data.Dataset 开始了我的实现。基本上我的数据集中的每个样本my_data 看起来像这样(例如):

{"words":[0,1,2,3,4],"label":1},
{"words":[4,9,20,30,4,2,3,4,1],"label":0}

接下来我看了一下Writing custom dataloaders with pytorch: 使用:

dataloader = DataLoader(my_data, batch_size=2,
                    shuffle=False, num_workers=4)

我怀疑对一个批次进行枚举会产生以下结果:

{"words":[[0,1,2,3,4],[4,9,20,30,4,2,3,4,1]],"labels":[1,0]}

然而它更像是这样的:

{"words":[[0,4],[1,9],[2,20],[3,30],[4,4]],"label":[1,0]}

我想这与它们的大小不相等有关。 它们是否需要相同的大小,如果需要,我该如何实现?对于了解这篇论文的人来说,您的训练数据是什么样的?

编辑:

class CustomDataset(Dataset):
def __init__(self, path_to_file, max_size=10, transform=None):

    with open(path_to_file) as f:
        self.data = json.load(f)
    self.transform = transform
    self.vocab = self.build_vocab(self.data)
    self.word2idx, self.idx2word = self.word2index(self.vocab)

def get_vocab(self):
    return self.vocab

def get_word2idx(self):
    return self.word2idx, self.idx2word

def __len__(self):
    return len(self.data)

def __getitem__(self, idx):
    if torch.is_tensor(idx):
        idx = idx.tolist()
    inputs_ = word_tokenize(self.data[idx][0])
    inputs_ = [w for w in inputs_ if w not in stopwords]
    inputs_ = [w for w in inputs_ if w not in punctuation]
    inputs_ = [self.word2idx[w] for w in inputs_]  # convert words to index

    label = {"positive": 1,"negative": 0}
    label_ = label[self.data[idx][1]] #convert label to 0|1

    sample = {"words": inputs_, "label": label_}

    if self.transform:
        sample = self.transform(sample)

    return sample

def build_vocab(self, corpus):
    word_count = {}
    for sentence in corpus:
        tokens = word_tokenize(sentence[0])
        for token in tokens:
            if token not in word_count:
                word_count[token] = 1
            else:
                word_count[token] += 1
    return word_count

def word2index(self, word_count):
    word_index = {w: i for i, w in enumerate(word_count)}
    idx_word = {i: w for i, w in enumerate(word_count)}
    return word_index, idx_word

【问题讨论】:

  • 你能分享你的自定义数据加载器类吗?

标签: python deep-learning nlp pytorch text-classification


【解决方案1】:

正如您正确怀疑的那样,这主要是张量形状不同的问题。幸运的是,PyTorch 为您提供了多种简单的解决方案来实现您想要的(文本样本的批量大小 >= 1):

  • 最高级别的解决方案可能是torchtext,它提供了几种开箱即用的解决方案来为 NLP 任务加载(自定义)数据集。如果您可以使您的训练数据适合任何一种描述的加载器,这可能是推荐的选择,因为有不错的文档和几个示例。
  • 如果您更喜欢构建解决方案,可以使用诸如torch.nn.utils.rnn.pad_sequence 之类的填充解决方案,与torch.nn.utils.pack_padded_sequence 结合使用,或将两者结合使用 (torch.nn.utils.rnn.pack_sequence。这通常可以为您提供更多的灵活性,这可能会或可能会不是你需要的东西。

就我个人而言,我只使用pad_sequence 有过很好的体验,并且牺牲了一点速度以获得更清晰的调试状态,并且似乎是others have similar recommendations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2021-03-27
    • 2021-11-09
    • 1970-01-01
    • 2020-08-07
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多