内核大小应该与一维卷积中的字长相同吗?

Should Kernel size be same as word size in 1D Convolution?

在 CNN 文献中,经常说明内核大小与一个人拥有的词汇表中最长单词的大小相同,当它扫过一个句子时。

那么如果我们用embedding来表示文本,那么kernel大小不应该和embedding维数一样,这样才能达到逐字逐句扫视的效果吗?

尽管字长不同,但我发现使用的内核大小不同。

嗯...这些是 1D 卷积,其内核是 3 维的。

的确,这 3 个维度之一必须与嵌入大小匹配(否则具有此大小将毫无意义)

这三个维度是:

(length_or_size, input_channels, output_channels)  

其中:

  • length_or_size (kernel_size): 任何你想要的。在图中,有 6 个不同的过滤器,大小分别为 4、4、3、3、2、2,用 "vertical" 维度表示。
  • input_channels(自动 embedding_size):嵌入的大小 - 这是强制性的(在 Keras 中这是自动的并且几乎不可见),否则乘法不会使用整个嵌入,这是没有意义的。在图中,过滤器的 "horizontal" 维度恒定为 5(与单词大小相同——这不是空间维度)。
  • output_channels (filters): 任何你想要的,但似乎图片只在谈论每个过滤器 1 个通道,因为它被完全忽略了,如果表示的话会像 "depth"。

所以,您可能混淆了哪些维度。当你定义一个 conv 层时,你会做:

Conv1D(filters = output_channels, kernel_size=length_or_size)

input_channels 自动来自嵌入(或上一层)。

正在 Keras 中创建此模型

要创建这个模型,应该是这样的:

sentence_length = 7
embedding_size=5

inputs = Input((sentence_length,))
out = Embedding(total_words_in_dic, embedding_size)

现在,假设这些过滤器只有 1 个通道(因为图像似乎没有考虑它们的深度......),我们可以将它们以 2 个通道为对加入:

size1 = 4
size2 = 3
size3 = 2
output_channels=2

out1 = Conv1D(output_channels, size1, activation=activation_function)(out)
out2 = Conv1D(output_channels, size2, activation=activation_function)(out)
out3 = Conv1D(output_channels, size3, activation=activation_function)(out)

现在,让我们折叠空间维度并保留两个通道:

out1 = GlobalMaxPooling1D()(out1)
out2 = GlobalMaxPooling1D()(out2)
out3 = GlobalMaxPooling1D()(out3)

并创建 6 通道输出:

out = Concatenate()([out1,out2,out3])

现在出现了从6通道到2通道的神秘跳跃,无法用图片解释。也许他们正在应用 Dense 层或其他东西......

#????????????????
out = Dense(2, activation='softmax')(out)

model = Model(inputs, out)