2

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

Traceback (most recent call last): File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 670, in _call_cpp_shape_fn_impl status) File "C:\Program Files\Anaconda3\lib\contextlib.py", line 66, in exit next(self.gen) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 469, in raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status)) tensorflow.python.framework.errors_impl.InvalidArgumentError: Negative dimension size caused by subtracting 5 from 2 for 'Conv2D_2' (op: 'Conv2D') with input shapes: [?,2,1,128], [5,1,128,128].

我需要改变它,例如当我例如需要使用像tweets这样的小消息。我使用了一个Tensorflow后端。

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

回答

7

让我们通过网络定义,分析层输出的图形时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实现。

+0

谢谢你非常匹配!它可以帮助我阻止模型中的形状流动。 –

+0

还有什么我可以解释的? –

+0

感谢您的关注!还有几个问题:1)在这种模型中使用丢失是否合理? 2)最后一次MaxPooling1D图层每次都要覆盖所有输出形状?在原始模型中,最后一个conv层的输出是35,我们将maxpool设置为相同的35值,在我的例子中,如果我们有最后一个conv 2,所以我们可以把maxpool设置为2. 3)我是对的,如果说增加值128号码)将会提高准确性 –