首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解PyTorch conv1D的输入形状吗?

了解PyTorch conv1D的输入形状吗?
EN

Stack Overflow用户
提问于 2020-06-14 13:07:07
回答 2查看 6.1K关注 0票数 7

这似乎是这里常见的问题之一(123.),但我仍然难以为PyTorch conv1D的输入定义正确的形状。

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

所以我对conv1D的输入张量是6,512,768。

代码语言:javascript
复制
input = torch.randn(6, 512, 768) 

现在,我希望使用来自conv1D层的PyTorch层,将内核大小为2的序列(512)的长度转换为2。

理解1:

我假设"in_channels“是conv1D层的嵌入维度。如果是这样,那么conv1D层将以这样的方式定义

代码语言:javascript
复制
in_channels = embedding dimension (768)
out_channels = 100 (arbitrary number)
kernel = 2

convolution_layer = nn.conv1D(768, 100, 2)
feature_map = convolution_layer(input)

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

代码语言:javascript
复制
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层将以这样的方式定义

代码语言:javascript
复制
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]的特征映射吗?

我会非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-14 13:54:59

在pytorch中,6,512,768的输入形状实际上应该是6,768,512,其中特征长度由通道维度表示,而序列长度是长度维度。然后可以定义输入/输出通道分别为768和100的conv1d,以获得6,100,511的输出。

给定一个形状为6,512,768的input,您可以使用Tensor.transpose将其转换为正确的形状。

代码语言:javascript
复制
input = input.transpose(1, 2).contiguous()

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

票数 7
EN

Stack Overflow用户

发布于 2020-11-23 03:04:13

我有一个建议给你,这可能不是你要求的,但可能会有所帮助。因为您的输入是(6, 512, 768),所以可以使用conv2d而不是1d。

您所需要做的就是在索引1处添加1的维数:input.unsqueeze(1),作为您的通道(将其视为灰度图像)。

代码语言:javascript
复制
def forward(self, x):
        x = self.embedding(x) # [Batch, seq length, Embedding] = [5, 512, 768])
        x = torch.unsqueeze(x, 1) #  [5, 1, 512, 768]) # like a grayscale image

对于您的conv2d层,也可以这样定义:

代码语言:javascript
复制
window_size=3 # for trigrams
EMBEDDING_SIZE = 768
NUM_FILTERS = 10 # or whatever you want
self.conv = nn.Conv2d(in_channels = 1,
                      out_channels = NUM_FILTERS,
                      kernel_size = [window_size, EMBEDDING_SIZE], 
                      padding=(window_size - 1, 0))```
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62372938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档