在CNN文献中,经常显示出内核大小与一个人在一个句子中扫过时在词汇表中最长的单词的大小相同。
因此,如果我们使用嵌入来表示文本,那么内核大小是否不应该与嵌入维相同,以使其具有与逐字扫描相同的效果?
尽管有字长,但我看到使用的内核大小不同。
答案 0 :(得分:1)
嗯...这些是一维卷积,其内核是3维的。
这3个尺寸之一确实必须与嵌入尺寸匹配(否则,拥有此尺寸将毫无意义)
这三个维度是:
(length_or_size, input_channels, output_channels)
位置:
length_or_size
(kernel_size
):任何您想要的。在图片中,有6个不同的滤镜,大小分别为4、4、3、3、2、2,以“垂直”尺寸表示。 input_channels
(自动为embedding_size
):嵌入的大小-这是非常必要的(在Keras中,这是自动的,几乎是不可见的),否则乘法将不会使用整个嵌入,这是没有意义的。在图片中,过滤器的“水平”尺寸始终为5(与字长相同-这不是空间尺寸)。 output_channels
(filters
):任何您想要的东西,但似乎图片只针对每个滤镜谈论1个通道,因为它被完全忽略了,并且如果表示的话,则类似于“深度”。 因此,您可能会混淆哪些尺寸。定义转换层时,您可以执行以下操作:
Conv1D(filters = output_channels, kernel_size=length_or_size)
input_channels
自动来自嵌入(或上一层)。
要创建此模型,将类似于:
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个通道的模糊跳转,图片无法解释。也许他们正在应用密集层之类的东西。……
#????????????????
out = Dense(2, activation='softmax')(out)
model = Model(inputs, out)