首页 文章

使用keras示例pretrained_word_embeddings时出错

提问于
浏览
2

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

回溯(最近一次调用最后一次):文件“C:\ Program Files \ 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 next(self.gen)文件”C:\ Program Files \ Anaconda3 \ lib \ site-packages \ tensorflow \ python \ framework \ errors_impl.py“,第469行,in raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status))tensorflow.python.framework.errors_impl.InvalidArgumentError:通过输入形状为'Conv2D_2'(op:'Conv2D')从2减去5引起的负维度大小:[?,2,1,128 ],[5,1,128,128] .

我需要更改它以防万一我需要使用像推文这样的小消息 . 我使用Tensorflow后端 .

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

1 回答

  • 8

    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 二重奏并将网络定义更改为:

    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 的大小 .

相关问题