这似乎是在这里的常见的问题(1,2,3),但我仍然在努力确定正确的形状输入到PyTorch conv1D。
我有长度为512(每个序列的标记数)的文本序列,每个标记由长度为768(嵌入)的向量表示。我正在使用的批量大小为6。
所以我输入到conv1D的张量的形状为[6,512,768]。
input = torch.randn(6, 512, 768)
现在,我想使用来自PyTorch的conv1D层对内核大小为2的序列(512)的长度进行卷积。
理解1:
我假设“ in_channels”是conv1D层的嵌入维。如果是这样,那么将以这种方式定义conv1D层,其中
in_channels = embedding dimension (768)
out_channels = 100 (arbitrary number)
kernel = 2
convolution_layer = nn.conv1D(768, 100, 2)
feature_map = convolution_layer(input)
但是基于这种假设,我得到以下错误:
RuntimeError: Given groups=1, weight of size 100 768 2, expected input `[4, 512, 768]` to have 768 channels, but got 512 channels instead
理解2:
然后,我假设“ in_channels”是输入序列的序列长度。如果是这样,那么将以这种方式定义conv1D层,其中
in_channels = sequence length (512)
out_channels = 100 (arbitrary number)
kernel = 2
convolution_layer = nn.conv1D(512, 100, 2)
feature_map = convolution_layer(input)
这可以正常工作,并且我得到了维度为的输出特征图[batch_size, 100, 767]
。但是,我很困惑。卷积层是否应该在512的序列长度上进行卷积并输出维度特征图[batch_size, 100, 511]
?
非常感谢您的帮助。
在pytorch中,您输入的[6,512,768]形状实际上应该是[6,768,512],其中特征长度由通道维表示,序列长度是长度维。然后,您可以使用分别为768和100的输入/输出通道定义conv1d,以获得[6、100、511]的输出。
给定input
形状[6,512,768],您可以使用将其转换为正确的形状Tensor.transpose
。
input = input.transpose(1, 2).contiguous()
该.contiguous()
张量的存储记忆确保连续加工过程中有助于避免潜在的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句