【问题标题】:Can I use pad_sequence with transformer in Pytorch?我可以在 Pytorch 中使用 pad_sequence 和变压器吗?
【发布时间】:2022-01-13 15:27:42
【问题描述】:

我正在尝试使用转换器来处理一些图像数据(不是 NLP 数据),例如具有不同序列长度的 480 x 640 图像,例如 [6, 480, 640], [7, 480, 640], [8, 480, 640]。我想把这三个序列放在一个批次中。

但是,我看到的大多数教程都使用 torchtext 来处理非固定长度问题。但由于我使用自己的数据集运行转换器,因此 torchtext 不适用(是吗?)。经过搜索发现pad_sequence可以用来解决这个问题。

但是我没有找到任何关于使用 pad_sequence 和变压器的教程。可以吗?有人试过吗?

【问题讨论】:

    标签: deep-learning pytorch transformer


    【解决方案1】:

    假设我们有 03 张不同尺寸的图片。对它们应用pad_sequence 函数将得到如下结果:

    import torch
    from torch.nn.utils.rnn import pad_sequence
    image_1 = torch.ones(25, 30)
    image_2 = torch.ones(32, 30)
    image_3 = torch.ones(29, 30)
    images = pad_sequence([image_1, image_2, image_3])
    print(images.size())
    # torch.Size([32, 3, 30])
    

    如果您使用 3D 图像,这将保持不变

    import torch
    from torch.nn.utils.rnn import pad_sequence
    image_1 = torch.ones(25, 30, 50)
    image_2 = torch.ones(32, 30, 50)
    image_3 = torch.ones(29, 30, 50)
    images = pad_sequence([image_1, image_2, image_3])
    print(images.size())
    # torch.Size([32, 3, 30, 50])
    

    使用此功能您应该注意的一件事是,它仅在图像共享n - 1 尺寸时才有效。换句话说,如果你有这样的事情:

    import torch
    from torch.nn.utils.rnn import pad_sequence
    image_1 = torch.ones(25, 30, 50)
    image_2 = torch.ones(32, 50, 30)
    image_3 = torch.ones(29, 31, 50)
    images = pad_sequence([image_1, image_2, image_3])
    # RuntimeError: The size of tensor a (50) must match the size of tensor b (30) at non-singleton dimension 2
    print(images.size())
    

    这行不通!

    但无论如何,由于您使用的是图像,我建议您使用来自 torchvision 的Pad 转换。它的工作原理与pad_sequence 函数相同,但有更多选项。只需关注doc

    【讨论】:

    • 感谢您的回答。对不起,我的问题不够清楚。我要处理的是具有相同形状的图像序列。假设我有一个批量大小为 4 的张量,以及具有相同图像大小 [480、640] 的不同长度的序列,例如 6、7、8、9。我可以使用 pad_sequence 来填充这些批次吗?
    猜你喜欢
    • 2010-12-13
    • 2021-01-13
    • 2020-08-06
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多