Python 如何改变PyTorch中嵌入层上执行一维卷积的轴?

Python 如何改变PyTorch中嵌入层上执行一维卷积的轴?,python,conv-neural-network,pytorch,embedding,Python,Conv Neural Network,Pytorch,Embedding,我一直在玩PyTorch中的文本分类,我遇到了一维卷积的问题 我已经设置了一个维度(x,y,z)的嵌入层,其中: x-表示批量大小 y-表示句子的长度(用填充固定,因此为40个单词) z-预训练单词嵌入的维度(目前为100) 为了简单起见,假设我放入一个矩阵(1,40100) 然而,据我所知,一旦我执行torch.nn.conv1d(*args), 结果矩阵变为(批大小=1,字大小=40,特征映射大小=98),内核大小为3 基本上,据我所知,它是围绕y轴而不是x轴卷积的,并且它并没有捕捉单词嵌入

我一直在玩PyTorch中的文本分类,我遇到了一维卷积的问题

我已经设置了一个维度(x,y,z)的嵌入层,其中: x-表示批量大小 y-表示句子的长度(用填充固定,因此为40个单词) z-预训练单词嵌入的维度(目前为100)

为了简单起见,假设我放入一个矩阵(1,40100)

然而,据我所知,一旦我执行torch.nn.conv1d(*args), 结果矩阵变为(批大小=1,字大小=40,特征映射大小=98),内核大小为3

基本上,据我所知,它是围绕y轴而不是x轴卷积的,并且它并没有捕捉单词嵌入之间的空间关系

有没有办法改变卷积层,这样它就可以计算不同轴周围的特征贴图

TL,DR:

Torch conv1d层在嵌入层上的行为如下:

但我希望它表现得像这样


任何帮助都将不胜感激。

conv1d希望输入的大小为(批大小、数量通道、长度),并且没有办法改变这一点,因此您有两种可能的方法,可以使用嵌入的输出,也可以使用conv1d代替嵌入层(in_channels=num_words,out_channels=word_embedding_size,kernel_size=1)这比嵌入慢,不是一个好主意

input = torch.randint(0, 10, (batch_size, sentence_length))
embeddings = word_embedding(input) #(batch_size, sentence_length, embedding_size)
embeddings_permuted = embeddings.permute(0, 2, 1) #(batch_size, embedding_size, sentence_length)
conv_out = convolution(embeddings_permuted) #(batch_size, conv_out_channels, changed_sentence_length)
#now you can either use the output as it is or permute it back (based on your upper layers)
#also note that I wrote changed_sentence_length because it is a fucntion of your padding and stride 

在卷积之前进行图形计算时转置嵌入:

    def forward(self, bacth_text):
        x = self.embeddings(batch_text)
        x = torch.transpose(x, 1, 2)
        x = self.conv1d(x)

非常感谢你们,我想我会尝试在嵌入矩阵上执行置换,看看它是如何进行的,因为我已经在keras中获得了种子训练模型。我会投票给你们,但由于这是我的第一篇帖子,我无法这样做,因为点系统或其他原因:)