【问题标题】:Error during playing with keras example pretrained_word_embeddings使用 keras 示例 pretrained_word_embeddings 时出错
【发布时间】:2017-02-22 13:26:27
【问题描述】:

我正在尝试修改 here 可用的 keras 示例 pretrained_word_embeddings 并且我遇到了以下问题:如果我将 MAX_SEQUENCE_LENGTH varibae 降低到 95 值,我会收到以下错误:

Traceback(最近一次调用最后一次):文件“C:\Program 文件\Anaconda3\lib\site-packages\tensorflow\python\framework\common_shapes.py", 第 670 行,在 _call_cpp_shape_fn_impl 状态)文件“C:\Program Files\Anaconda3\lib\contextlib.py”,第 66 行,在 exit 下一个(self.gen)文件“C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py”, 第 469 行,在 raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status)) tensorflow.python.framework.errors_impl.InvalidArgumentError: Negative 'Conv2D_2' 从 2 中减去 5 导致的尺寸大小(操作: 'Conv2D') 输入形状:[?,2,1,128], [5,1,128,128]。

我需要更改它以防我需要处理诸如推文之类的小消息。我使用 TensorFlow 后端。

请帮我澄清一下 1)MAX_SEQUENCE_LENGTH有什么问题? 2)Conv2D_2 在跟踪中而不是我在模型中使用的Conv1D 的原因是什么。

【问题讨论】:

    标签: machine-learning tensorflow neural-network keras conv-neural-network


    【解决方案1】:

    我们来看看网络定义,分析MAX_SEQUENCE_LENGTH=95时层输出的形状:

    sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
    embedded_sequences = embedding_layer(sequence_input)
    # Output shape: (95, EMBEDDING_DIM)
    x = Conv1D(128, 5, activation='relu')(embedded_sequences)
    # Output shape: (91, 128) (because of valid border mode) 
    x = MaxPooling1D(5)(x)
    # Output shape: (18, 128)
    x = Conv1D(128, 5, activation='relu')(x)
    # Output shape: (14, 128)
    x = MaxPooling1D(5)(x)
    # Output shape: (2, 128)
    x = Conv1D(128, 5, activation='relu')(x)
    # Output shape: (2 - 4??, 128) - PROBLEM!!
    x = MaxPooling1D(35)(x) # In the easiest way - change 35 to 2.
    x = Flatten()(x)
    x = Dense(128, activation='relu')(x)
    preds = Dense(100, activation='softmax')(x)
    

    如您所见,问题在于最后一个Conv1D 层,该层没有足够的维度来应用具有valid 边界模式的卷积。有很多方法可以解决这个问题。最简单的方法是裁剪最后一个 Conv-MaxPool duo 并将网络定义更改为:

    sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
    embedded_sequences = embedding_layer(sequence_input)
    # Output shape: (95, EMBEDDING_DIM)
    x = Conv1D(128, 5, activation='relu')(embedded_sequences)
    # Output shape: (91, 128) (because of valid border mode) 
    x = MaxPooling1D(5)(x)
    # Output shape: (18, 128)
    x = Conv1D(128, 5, activation='relu')(x)
    # Output shape: (14, 128)
    x = MaxPooling1D(5)(x)
    # Output shape: (2, 128)
    x = Flatten()(x) # Here - everything is ok.
    x = Dense(128, activation='relu')(x)
    preds = Dense(100, activation='softmax')(x)
    

    当然 - 还有更多方法可以做到这一点(比如使用池大小等)。

    使用Conv2D 背后的原因是,在TensorFlow 后端的情况下,Conv1D 是通过二维卷积实现的,其中一维压缩成1 的大小。

    【讨论】:

    • 非常感谢你!它可以帮助我理解模型中的形状流。
    • 还有什么我可以解释的吗?
    • 感谢您的关注!几个额外的问题:1)在这种模型中使用 dropout 是否合理? 2) 最后一个 MaxPooling1D 层每次都必须覆盖所有输出形状?在原始模型中,最后一个 conv 层输出为 35,我们将 maxpool 设置为相同的 35 值,在我的示例中,如果我们有最后一个 conv 2,那么我们可以将 maxpool 设置为 2。 3) 如果说增加值 128,我是否正确(内核number) 将提高准确性
    • 这个问题非常广泛,很难在一条评论中做出回应。请 - 在 SO 提出这个新问题。
    • 你说得对,我刚刚在 SO 提出新问题。请在这里查看stackoverflow.com/questions/42433443/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2021-03-06
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多