了解 PyTorch conv1D 的输入形状?

adj*_*oun 12 conv-neural-network pytorch

这似乎是这里的常见问题之一(1,2,3 ) 但我仍在努力定义PyTorch conv1D输入的正确形状

我有长度为 512 的文本序列(每个序列的标记数量),每个标记由长度为 768 的向量表示(嵌入)。我使用的批量大小是 6。

所以我的 conv1D 输入张量的形状为 [6, 512, 768]。

input = torch.randn(6, 512, 768) 
Run Code Online (Sandbox Code Playgroud)

现在,我想使用 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)
Run Code Online (Sandbox Code Playgroud)

但有了这个假设,我得到以下错误:

RuntimeError: Given groups=1, weight of size 100 768 2, expected input `[4, 512, 768]` to have 768 channels, but got 512 channels instead
Run Code Online (Sandbox Code Playgroud)

理解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)
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了维度 的输出特征图[batch_size, 100, 767]。然而,我很困惑。卷积层不应该对长度为 512 的序列进行卷积并输出维度为 的特征图吗[batch_size, 100, 511]

我将非常感谢您的帮助。

jod*_*dag 8

在 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()
Run Code Online (Sandbox Code Playgroud)

.contiguous()确保了张量的内存是连续存储的,这有助于避免处理过程中的潜在问题。