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]?
我将非常感谢您的帮助。
在 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()确保了张量的内存是连续存储的,这有助于避免处理过程中的潜在问题。
| 归档时间: |
|
| 查看次数: |
11957 次 |
| 最近记录: |