Nlp PyTorch:动态计算图-填充-数据加载器之间的关系

Nlp PyTorch:动态计算图-填充-数据加载器之间的关系,nlp,deep-learning,padding,pytorch,Nlp,Deep Learning,Padding,Pytorch,据我所知,Pytork的强大之处在于它可以处理动态计算图形。在NLP的上下文中,这意味着具有可变长度的序列不一定需要填充到相同的长度。但是,如果我想使用PyTorch数据加载器,我需要填充我的序列,因为数据加载器只接受张量——因为我是一个完全的初学者,不想构建一些定制的collate\u fn 现在,这让我想知道——在这种情况下,动态计算图的全部优势不是都被洗掉了吗? 此外,如果我填充序列,将其作为张量输入数据加载器,并在末尾添加许多零作为填充标记(在单词ID的情况下),这是否会对我的训练产生任

据我所知,Pytork的强大之处在于它可以处理动态计算图形。在NLP的上下文中,这意味着具有可变长度的序列不一定需要填充到相同的长度。但是,如果我想使用PyTorch数据加载器,我需要填充我的序列,因为数据加载器只接受张量——因为我是一个完全的初学者,不想构建一些定制的collate\u fn

现在,这让我想知道——在这种情况下,动态计算图的全部优势不是都被洗掉了吗? 此外,如果我填充序列,将其作为张量输入数据加载器,并在末尾添加许多零作为填充标记(在单词ID的情况下),这是否会对我的训练产生任何负面影响,因为PyTorch可能不会针对填充序列的计算进行优化(因为整个前提是它可以处理动态图中的可变序列长度),或者它只是没有任何区别

我也会在PyTorch论坛上发布这个问题

谢谢

在NLP的上下文中,这意味着具有可变长度的序列不一定需要填充到相同的长度

这意味着您不需要填充序列,除非您正在进行数据批处理,这是当前在PyTorch中添加并行性的唯一方法。DyNet有一个名为(详细描述)的方法,该方法对图形操作而不是数据进行批处理,因此这可能是您想要研究的

但是,如果我想使用PyTorch数据加载器,我需要填充我的序列,因为数据加载器只接受张量——因为我是一个完全的初学者,不想构建一些定制的collate\u fn

如果您编写自己的
数据集
类,并且使用的是
批处理大小=1
,则可以使用
数据加载器
。关键是对可变长度序列使用numpy数组(否则
默认值_-collate
将给您带来困难):

现在,这让我想知道——在这种情况下,动态计算图的全部优势不是都被洗掉了吗

公平点,但动态计算图的主要优点是(至少目前)主要是使用调试工具(如pdb)的可能性,它可以快速缩短开发时间。使用静态计算图进行调试要困难得多。PyTorch也没有理由不在将来实现进一步的实时优化或类似于DyNet自动批处理的概念

此外,如果我填充序列以将其作为张量输入数据加载器,并在末尾[…]添加许多零作为填充标记,这会对我的训练产生任何负面影响[…]


是的,在运行时和渐变中都是这样。RNN将像普通数据一样迭代填充,这意味着您必须以某种方式对其进行处理。PyTorch为您提供了处理填充序列和RNN的工具,即和。这些工具将允许您在RNN执行期间忽略填充元素,但请注意:这不起作用我不熟悉NLP,也不熟悉你在文章中提到的填充过程。但据我所知,在我所有的项目中,我没有使用pytorch的数据加载器。我加载数据并手动洗牌。
from torch.utils.data import Dataset
from torch.utils.data.dataloader import DataLoader

class FooDataset(Dataset):
    def __init__(self, data, target):
        assert len(data) == len(target)
        self.data = data
        self.target = target
    def __getitem__(self, index):
        return self.data[index], self.target[index]
    def __len__(self):
        return len(self.data)

data = [[1,2,3], [4,5,6,7,8]]
data = [np.array(n) for n in data]
targets = ['a', 'b']

ds = FooDataset(data, targets)
dl = DataLoader(ds, batch_size=1)

print(list(enumerate(dl)))
# [(0, [
#  1  2  3
# [torch.LongTensor of size 1x3]
# , ('a',)]), (1, [
#  4  5  6  7  8
# [torch.LongTensor of size 1x5]
# , ('b',)])]