为了账号安全,请及时绑定邮箱和手机立即绑定

用于句子的 Pytorch 数据加载器

用于句子的 Pytorch 数据加载器

临摹微笑 2022-07-12 09:57:14
我收集了一个用于二进制文本分类的小数据集,我的目标是使用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}接下来我看了一下用 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.vocabdef get_word2idx(self):    return self.word2idx, self.idx2worddef __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
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

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

  • 最高级别的解决方案可能是torchtext,它提供了几种开箱即用的解决方案来为 NLP 任务加载(自定义)数据集。如果您可以使您的训练数据适合任何一种描述的加载器,这可能是推荐的选项,因为有一个不错的文档和几个示例。

  • 如果您更喜欢构建解决方案,则可以使用填充解决方案,例如torch.nn.utils.rnn.pad_sequence, 组合torch.nn.utils.pack_padded_sequence或两者的组合 ( torch.nn.utils.rnn.pack_sequence。这通常可以为您提供更大的灵活性,这可能是也可能不是你需要的。

就个人而言,我有很好的使用 just 的经验pad_sequence,并且为了更清晰的调试状态牺牲了一点速度,似乎其他人也有类似的建议


查看完整回答
反对 回复 2022-07-12
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信