【问题标题】:Should Kernel size be same as word size in 1D Convolution?内核大小应该与一维卷积中的字大小相同吗?
【发布时间】:2018-12-03 07:47:24
【问题描述】:

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

那么如果我们用embedding来表示文本,那么kernel size不应该和embedding维度一样,这样就可以得到和逐字扫描一样的效果吗?

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

【问题讨论】:

    标签: keras deep-learning conv-neural-network word-embedding


    【解决方案1】:

    嗯...这些是 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 自动来自嵌入(或上一层)。

    在 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)
    

    【讨论】:

    • 好吧,我应该措辞更好。我对这张照片真的不感兴趣。我只是用它来说明。这是来自 Keras 的 conv1D:keras.layers.Conv1D(filters, kernel_size, .........) 这是来自 Keras 的嵌入层:keras.layers.Embedding(input_dim, output_dim,.....) 什么我想知道'output_dim'(我称之为嵌入维度)和'kernel_size'是否需要相同的大小?
    • 不,过滤器将具有以下维度:(kernel_size, automatic_embedding_size, filters),其中automatic_embedding_size==input_channels
    • 这让我很困惑。我们喜欢谈论滑动窗口(内核宽度)应该如何覆盖一个完整的单词(在插图中),但是当我们将单词表示为嵌入时,滑动窗口不需要覆盖对应于一个完整单词的嵌入宽度.
    • 是的......这很令人困惑,因为 Keras 从未提及内核的第三维(可能是因为它变得简单易行)。你定义的这个kernel_size(在3个维度中)是唯一存在的空间维度,也是唯一的滑动方向,这就是为什么它是一维卷积,它指的是“句子长度”。 --- 如果您使用 2D 卷积,那么您将开始将宽度和高度作为内核大小(2 个空间维度),加上输出过滤器,再加上从未提及的输入通道,从而形成 4D 内核。
    • 我正在认真考虑这一点。越来越多的人告诉我这个......
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2018-10-21
    • 1970-01-01
    • 2013-06-06
    • 2019-03-30
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多