Mik*_*ich 2 machine-learning neural-network conv-neural-network keras tensorflow
我正在尝试修改此处可用的keras示例pretrained_word_embeddings,我遇到了以下问题:如果我将MAX_SEQUENCE_LENGTHvaribae 减少为例如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在模型中使用的原因.
在以下情况下,让我们通过网络定义并分析图层输出的形状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)
Run Code Online (Sandbox Code Playgroud)
您可能会看到问题出在最后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)
Run Code Online (Sandbox Code Playgroud)
当然 - 有更多的方法可以做到这一点(比如玩游泳池大小等).
使用背后的原因Conv2D来自于TensorFlow后端a Conv1D的情况是通过二维卷积实现的,其中一个维度被挤压成具有的尺寸1.
| 归档时间: |
|
| 查看次数: |
609 次 |
| 最近记录: |