我正在尝试使用转换器来处理一些图像数据(不是NLP数据),例如具有不同序列长度的480 x 640图像,例如[6,480,640],[7,480,640],[8,480,640]。我想把这三个序列放在一批中。
但是,我看到的大多数教程都使用torchtext来处理非固定长度问题。但是由于我使用自己的数据集运行转换器,因此火炬文本不适用(是吗?搜索后,我发现pad_sequence可以用来解决这个问题。
但是我没有找到任何关于将pad_sequence与变压器一起使用的教程。它适用吗?以前有人尝试过吗?
假设我们有 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())
行不通!
但无论如何,既然你正在处理图像,我建议你使用火炬视觉的Pad
变换。它的工作方式与pad_sequence
功能相同,但具有更多选项。只需按照文档进行操作即可。