gpt4 book ai didi

python - Pytorch 句子数据加载器

转载 作者:行者123 更新时间:2023-12-01 06:29:33 25 4
gpt4 key购买 nike

我收集了一个用于二进制文本分类的小数据集,我的目标是使用 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

最佳答案

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

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

就我个人而言,我仅使用 pad_sequence 就获得了很好的体验,并牺牲了一点速度以获得更清晰的调试状态,并且看起来 others have similar recommendations .

关于python - Pytorch 句子数据加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com