Pytorch 了解Py1D的输入形状?

Pytorch 了解Py1D的输入形状?,pytorch,conv-neural-network,Pytorch,Conv Neural Network,这似乎是这里常见的问题之一(,),但我仍在努力定义输入的正确形状 我有长度为512的文本序列(每个序列的令牌数),每个令牌由长度为768的向量表示(嵌入)。我使用的批量是6 所以我输入conv1D的张量是[6512768]的形状 input = torch.randn(6, 512, 768) 现在,我想使用PyTorch中的conv1D层对内核大小为2的序列长度(512)进行卷积 input_transposed = input.transpose(1, 2) 理解1: 我假设“in_c

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

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

所以我输入conv1D的张量是[6512768]的形状

input = torch.randn(6, 512, 768) 
现在,我想使用PyTorch中的conv1D层对内核大小为2的序列长度(512)进行卷积

input_transposed = input.transpose(1, 2)
理解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)
in_channels = sequence length (512)
out_channels = 100 (arbitrary number)
kernel = 2

convolution_layer = nn.conv1D(512, 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 = embedding dimension (768)
out_channels = 100 (arbitrary number)
kernel = 2

convolution_layer = nn.conv1D(768, 100, 2)
feature_map = convolution_layer(input)
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\u size,100767]
的输出特征映射。然而,我感到困惑。卷积层不应该在512的序列长度上卷积并输出一个维度为
[batch\u size,100511]
的特征映射吗


我将非常感谢您的帮助。

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

给定一个[6151768]形状的
输入
,您可以使用将其转换为正确的形状

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

我找到了答案()

所以,通常,伯特输出形状向量

[batch_size, sequence_length, embedding_dim].
在哪里,

sequence_length=序列中的单词或标记数(BERT可以处理的最大长度序列为512)
embedding_dim=描述每个标记的向量的向量长度(对于BERT,为768)。

因此,
input=torch.randn(批量大小,512768)

现在,我们希望使用2的内核大小对长度为512的文本序列进行卷积

因此,我们定义了一个Py1D层,如下所示

convolution_layer = nn.conv1d(in_channels, out_channels, kernel_size)
在哪里,

in_channels=嵌入_dim
输出通道=任意整数
内核大小=2(我想要bigrams)

因此,
卷积层=nn.conv1d(768100,2)

现在,我们需要在
卷积层的预期输入和实际输入之间建立连接

为此,我们需要

当前输入形状[批量大小,512,768] 预期输入[批量大小,768512]

为了实现这个预期的输入形状,我们需要使用PyTorch的转置函数

input_transposed = input.transpose(1, 2)

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

您只需在索引1处添加一个1的维度:
input.unsqueze(1)
作为您的频道(将其视为灰度图像)

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

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))```

一般来说,PyTorch nn模块工作于(N,C_In,*)输入和输出(N,C_out,*),其中C_In和C_out*DIM是“操作发生”的DIM。所有Conv*都是如此。