首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >播放keras示例pretrained_word_embeddings时出错

播放keras示例pretrained_word_embeddings时出错
EN

Stack Overflow用户
提问于 2017-02-22 13:26:27
回答 1查看 676关注 0票数 2

我正在尝试修改可用的pretrained_word_embeddings示例这里,并面临以下问题:如果我将MAX_SEQUENCE_LENGTH变量减少为95值,我将得到以下错误:

回溯(最近一次调用):文件“C:\ Files\Anaconda3\lib\site-packages\tensorflow\python\framework\common_shapes.py",第670行,处于_call_cpp_shape_fn_impl状态)文件”C:\ProgramFiles\Anaconda3\lib\contextlib.py“,第66行,在exit next(self.gen) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py",第469行,在tensorflow.python.framework.errors_impl.InvalidArgumentError: raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(Status)中,从输入形状为:?、2、1、128、5、1、128的“Conv2D_2”(op:“Conv2D”)中减去5所引起的负维尺寸。

我需要改变它,以防万一,例如,我需要处理像tweet这样的小消息。我用的是Tensorflow后端。

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-22 19:02:40

让我们通过网络定义,分析MAX_SEQUENCE_LENGTH=95时层输出的形状

代码语言:javascript
复制
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二重奏,并将网络定义更改为:

代码语言:javascript
复制
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大小。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42392798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档