每次重复后,keras模型的训练变慢

E.O*_*.O. 10 python keras tensorflow

我正在编写一些代码来优化神经网络体系结构,因此有一个python函数create_nn(parms)可以创建和初始化keras模型。但是,我遇到的问题是,经过较少的迭代后,模型的训练时间比平时要长得多(最初一个历时需要10秒,然后大约第14个模型(每个模型训练20个历时)之后,它需要60秒/时代)。我知道这不是因为架构的发展所致,因为如果我重新启动脚本并开始将其结束,则它将恢复正常速度。

我目前正在跑步

from keras import backend as K
Run Code Online (Sandbox Code Playgroud)

然后一个

K.clear_session()
Run Code Online (Sandbox Code Playgroud)

在训练任何给定的新模型之后。

其他一些细节:

  • 对于前12个模型,每个时期的训练时间大致保持恒定,为10秒/时期。然后,在第13个模型中,每个时期的训练时间稳定地上升到60秒。然后每个纪元的训练时间徘徊在大约60秒/纪元。

  • 我正在使用Tensorflow作为后端运行keras

  • 我正在使用Amazon EC2 t2.xlarge实例

  • 有足够的可用RAM(7GB可用,带5GB的数据集)

我删除了很多层和参数,但实际上create_nn看起来像:

def create_nn(features, timesteps, number_of_filters):
    inputs = Input(shape = (timesteps, features))
    x = GaussianNoise(stddev=0.005)(inputs)
    #Layer 1.1
    x = Convolution1D(number_of_filters, 3, padding='valid')(x)
    x = Activation('relu')(x)
    x = Flatten()(x)
    x = Dense(10)(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = Dropout(0.5)(x)
    # Output layer
    outputs = Dense(1, activation='sigmoid')(x)
    model = Model(inputs=inputs, outputs=outputs)

    # Compile and Return
    model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
    print('CNN model built succesfully.')
    return model
Run Code Online (Sandbox Code Playgroud)

请注意,尽管Sequential模型可以在此虚拟示例中使用,但实际用例需要功能性API。

我该如何解决这个问题?

Pan*_*hin 6

为什么每次跑步后我的训练时间都会增加?

简短的回答:您需要tf.keras.backend.clear_session()在创建的每个新模型之前使用。

此问题似乎仅在关闭急切执行时才会发生。

好的,让我们在使用和不使用clear_session 的情况下进行实验。代码为make_model位于此响应的末尾。

首先,我们看一下使用clear session时的训练时间。我们将运行此实验 10 次并打印结果

使用 tf.keras.backend.clear_session()

non_seq_time = [ make_model(clear_session=True) for _ in range(10)]
Run Code Online (Sandbox Code Playgroud)

与clear_session=True

non sequential
Elapse =  1.06039
Elapse =  1.20795
Elapse =  1.04357
Elapse =  1.03374
Elapse =  1.02445
Elapse =  1.00673
Elapse =  1.01712
Elapse =    1.021
Elapse =  1.17026
Elapse =  1.04961
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,训练时间保持不变

现在让我们在不使用清晰会话的情况下重新运行实验并查看训练时间

不要使用 tf.keras.backend.clear_session()

non_seq_time = [ make_model(clear_session=True) for _ in range(10)]
Run Code Online (Sandbox Code Playgroud)

与clear_session=False

non sequential
Elapse =  1.10954
Elapse =  1.13042
Elapse =  1.12863
Elapse =   1.1772
Elapse =   1.2013
Elapse =  1.31054
Elapse =  1.27734
Elapse =  1.32465
Elapse =  1.32387
Elapse =  1.33252
Run Code Online (Sandbox Code Playgroud)

如您所见,没有clear_session,训练时间会增加

完整代码示例

non sequential
Elapse =  1.06039
Elapse =  1.20795
Elapse =  1.04357
Elapse =  1.03374
Elapse =  1.02445
Elapse =  1.00673
Elapse =  1.01712
Elapse =    1.021
Elapse =  1.17026
Elapse =  1.04961
Run Code Online (Sandbox Code Playgroud)