【发布时间】:2018-12-03 07:47:24
【问题描述】:
在 CNN 文献中,经常说明当扫描一个句子时,内核大小与词汇表中最长单词的大小相同。
那么如果我们用embedding来表示文本,那么kernel size不应该和embedding维度一样,这样就可以得到和逐字扫描一样的效果吗?
尽管字长不同,但我发现使用的内核大小不同。
【问题讨论】:
标签: keras deep-learning conv-neural-network word-embedding
在 CNN 文献中,经常说明当扫描一个句子时,内核大小与词汇表中最长单词的大小相同。
那么如果我们用embedding来表示文本,那么kernel size不应该和embedding维度一样,这样就可以得到和逐字扫描一样的效果吗?
尽管字长不同,但我发现使用的内核大小不同。
【问题讨论】:
标签: keras deep-learning conv-neural-network word-embedding
嗯...这些是 1D 卷积,其内核是 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 通道的神秘跳跃,图片无法解释。也许他们正在应用 Dense 层之类的......
#????????????????
out = Dense(2, activation='softmax')(out)
model = Model(inputs, out)
【讨论】:
(kernel_size, automatic_embedding_size, filters),其中automatic_embedding_size==input_channels。
kernel_size(在3个维度中)是唯一存在的空间维度,也是唯一的滑动方向,这就是为什么它是一维卷积,它指的是“句子长度”。 --- 如果您使用 2D 卷积,那么您将开始将宽度和高度作为内核大小(2 个空间维度),加上输出过滤器,再加上从未提及的输入通道,从而形成 4D 内核。