Machine learning 使用keras示例预训练单词嵌入时出错

Machine learning 使用keras示例预训练单词嵌入时出错,machine-learning,tensorflow,neural-network,keras,conv-neural-network,Machine Learning,Tensorflow,Neural Network,Keras,Conv Neural Network,我正在尝试修改可用的keras示例预训练单词嵌入,我面临以下问题:如果我将MAX\u SEQUENCE\u LENGTHvaribae(例如)减小到95值,我将得到以下错误: 回溯(最近一次调用):文件“C:\Program” Files\Anaconda3\lib\site packages\tensorflow\python\framework\common_shapes.py“, 第670行,在调用cpp形状fn impl中 状态)文件“C:\Program Files\Anaconda3

我正在尝试修改可用的keras示例预训练单词嵌入,我面临以下问题:如果我将
MAX\u SEQUENCE\u LENGTH
varibae(例如)减小到
95
值,我将得到以下错误:

回溯(最近一次调用):文件“C:\Program” Files\Anaconda3\lib\site packages\tensorflow\python\framework\common_shapes.py“, 第670行,在调用cpp形状fn impl中 状态)文件“C:\Program Files\Anaconda3\lib\contextlib.py”,第66行,在退出中 下一个(self.gen)文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\framework\errors\u impl.py”, 第469行,处于raise_exception_on_not_ok_状态 pywrap_tensorflow.TF_GetCode(status))tensorflow.python.framework.errors_impl.invalidargumeinterror:Negative “Conv2D_2”(op: “Conv2D”)和输入形状:[?,2,1128],[5,1128128]

例如,当我需要处理像推特这样的小消息时,我需要更改它。我使用Tensorflow后端

请帮我澄清一下 1)
MAX\u SEQUENCE\u LENGTH
有什么问题?
2) 是什么原因导致
Conv2D\u 2
在跟踪中而不是我在模型中使用的
Conv1D

让我们看看网络定义,并分析
MAX\u SEQUENCE\u 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
层,该层没有足够的维度来应用
有效的
边界模式的卷积。有很多方法可以解决这个问题。最简单的方法是裁剪最后一个
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)在这种模式中使用辍学是否合理?2) 最后一个MaxPoolg1d层每次都必须覆盖所有输出形状?在原始模型中,last conv layer输出为35,我们将maxpool设置为相同的35值,在我的示例中,如果我们有last conv 2,那么我们可以将maxpool设置为2。3) 如果说增加值128(内核数)将提高精度,我说得对吗?这个问题非常广泛,很难用一句话来回答。请-在SO作为一个新问题提问。你是对的,我刚刚在SO提出了一个新问题。请在这里查一下