如何更改在PyTorch的嵌入层上执行一维卷积的轴?

时间:2019-03-18 17:32:49

标签: python conv-neural-network pytorch embedding

我一直在PyTorch中处理文本分类,并且遇到了一维卷积的问题。

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

为简单起见,假设我放入(1,40,100)的矩阵

但是,据我所知,一旦执行torch.nn.conv1d(* args), 生成的矩阵变为(批大小= 1,字大小= 40,特征图大小= 98),内核大小为3。

基本上,据我所知,它围绕y轴而不是x轴进行卷积,并且转而无法捕获单词嵌入之间的空间关系。

有什么方法可以改变卷积层,以便计算绕不同轴的特征图吗?

TL,DR:

火炬转换层在嵌入层上的行为如下: enter image description here

但是我希望它表现得如此

enter image description here

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

conv1d期望输入的大小为(batch_size,num_channels,length),并且无法更改它,因此您有两种可能的选择,您可以permute嵌入输出,也可以可以使用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 

答案 1 :(得分:0)

在卷积之前进行图评估时转置嵌入:

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