使用keras示例pretrained_word_embeddings时出错

时间:2017-02-22 13:26:28

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

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

  

回溯(最近一次调用最后一次):文件" C:\ Program   文件\ Anaconda3 \ LIB \站点包\ tensorflow \ python的\框架\ common_shapes.py&#34 ;,   第670行,在_call_cpp_shape_fn_impl中       status)文件" C:\ Program Files \ Anaconda3 \ lib \ contextlib.py",第66行,退出       next(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:否定   尺寸大小是由Conv2D_2' Conv2D_2'中的2减去5引起的。 (OP:   ' Conv2D')输入形状:[?,2,1,128],[5,1,128,128]。

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

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

1 个答案:

答案 0 :(得分: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}}。