使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch

Posted

技术标签:

【中文标题】使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch【英文标题】:Stuck in the first epoch when training the CNN-LSTM using Keras 【发布时间】:2020-05-05 14:23:24 【问题描述】:

我正在使用 Keras 构建用于推文分类的 CNN-LSTM 模型。该模型有两个输入,任务是三类分类。我用来构建模型的代码如下:

def conv2d_lstm_with_author():

    # Get the input information - author & tweet
    author_repre_input = Input(shape=(100,), name='author_input')
    tweet_input = Input(shape=(13, 100, 1), name='tweet_input')

    # Create the convolutional layer and lstm layer
    conv2d = Conv2D(filters = 200, kernel_size = (2, 100), padding='same', activation='relu', 
                    use_bias=True, name='conv_1')(tweet_input)
    flat = Flatten(name='flatten_1')(conv2d)
    reshape_flat = Reshape((260000, 1), name='reshape_1')(flat)
    lstm = LSTM(100, return_state=False, activation='tanh', recurrent_activation='hard_sigmoid', name='lstm_1')(reshape_flat)
    concatenate_layer = concatenate([lstm, author_repre_input], axis=1, name='concat_1')
    dense_1 = Dense(10, activation='relu', name='dense_1')(concatenate_layer)
    output = Dense(3, activation='softmax', kernel_regularizer=regularizers.l2(0.01), name='output_dense')(dense_1)

    # Build the model
    model = Model(inputs=[author_repre_input, tweet_input], outputs=output)
    return model

model = conv2d_lstm_with_author()
model.summary()

optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

我的两个输入和标签的形状是:

author_repre_input: (40942, 100)
tweet_input: (40942, 13, 100, 1)
my label Train_Y: (40942, 3)

模型摘要的快照是:

当我使用以下代码训练数据时:

model.fit([author_repre_input, tweet_input], [Train_Y], epochs=20, batch_size=32, validation_split=0.2, 
          shuffle=False, verbose=2)

结果一直停留在第一个 epoch 并且日志没有显示任何有用的信息,只是:

Epoch 1/20

我想知道为什么会这样。我使用的tensorflow和keras的版本是:

tensorflow - 1.14.0
keras - 2.2.0

非常感谢您的宝贵时间!


1 月 20 日更新...

我尝试使用 Google Colab 来训练模型。我在运行模型时检查 RAM。 Colab 为我分配了 25G RAM。然而,经过几秒钟的训练,由于占用了所有可用的 RAM,会话崩溃了......

我认为模型部分一定有问题...任何建议和见解将不胜感激!

【问题讨论】:

根据 Stack Overflow 的规则,您最好针对这个问题提出一个单独的问题。 【参考方案1】:

幸运的是,你没有被卡住。

问题在于您在model.fit 中指定了参数verbose=2

这意味着您的代码只会在一个 epoch 结束时输出消息,而不是在训练过程中输出信息。

要解决您的问题并查看训练进度,请设置verbose=1

【讨论】:

哇,谢谢您的及时回复!但是当我将详细设置更改为verbose=1 时,我只能看到:Shell Train on 32753 samples, validate on 8189 samples Epoch 1/20 好吧,还是说明你的问题解决了。您需要稍等片刻才能开始训练。 也许...我没有任何 GPU...但是谢谢您的回答 我不知道这是否有帮助,即使您使用的是 Google Colab,只要会话崩溃,您也可以将 RAM 增加到 32GB。因此,一旦您扩展 RAM,它可能会有所帮助。请确认您使用的是 GPU 还是 TPU,因为与 Google Colab 中的 TPU 相比,GPU 会更快【参考方案2】:

我想我已经找到了答案……

问题出在卷积层。内核尺寸太小,导致输出层的维度太高。为了解决这个问题,我将内核大小从(2, 100) 更改为(3, 100)。此外,我还在我的模型中添加了 dropout。我现在使用的模型总结如下:

现在模型可以在 Google Colab 中顺利运行了。

因此,我想如果出现类似的问题,请检查每一层的输出维度。如果模型创建的输出维度非常高,Keras API 可能会在训练阶段停止。

【讨论】:

如果这是真的,那么如何在 Keras 上训练对象检测:s?

以上是关于使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch的主要内容,如果未能解决你的问题,请参考以下文章

在 keras 中使用 CNN-LSTM 模型进行序列到序列分类

Keras CNN-LSTM:制作 y_train 时出错

Tomcat 在使用 WebappRunner 时卡在“Starting ProtocolHandler”

使用 nvp 设置快速结帐时卡在使用 curl 进行授权/身份验证

设置颤振时卡在dart sdk下载

eclipse启动时卡在进度条处