首页 > 解决方案 > 深度学习早期停止循环中的回调奇怪行为

问题描述

我正在循环中测试顺序模型的准确性,包括提前停止回调。

我的环境是

tensorflow                2.1.0           gpu_py37h7a4bb67_0
tensorflow-base           2.1.0           gpu_py37h6c5654b_0
tensorflow-estimator      2.0.1                    pypi_0    pypi
tensorflow-gpu            2.0.0                    pypi_0    pypi

我在 jupyter notebook 中运行我的测试。

Python 版本是 3.7.7

for x in range:
   create_model()
   history=model.fit(..callback=[es_val_loss]..)

我的回调是

es_val_loss = EarlyStopping(monitor='val_loss', 
                   mode='auto', 
                   verbose=0, 
                   patience=PATIENCE,
                   min_delta=ES_VAL_LOSS_MIN_DELTA,
                   baseline=None,
                   restore_best_weights=True)

我的 create_model() 是

def create_model( ... ):
    ## Create our model
    model = Sequential()

    # 1st layer
    model.add(Dense())
    model.add(Dropout())
    # other layers
    model.add(Dense())
    model.add(Dropout())

    model.add(Dense())
    model.add(Dropout())

    # output layer: dim=1, activation sigmoid
    model.add(Dense( ))
    myoptimizer = optimizers.Adam(lr=learning_rate)
    # Compile the model
    model.compile(loss='binary_crossentropy',   # since we are predicting 0/1
             optimizer=myoptimizer,
             metrics=['accuracy'])
    return model

对于第一个模型,回调响应从 inf 开始,用于 val_loss

Epoch 00001: val_loss improved from inf to ... saving model to ...

对于循环中的其他模型,我的回调保留了前一个模型的结果,并且不是从 inf 开始,而是使用前一个模型的最佳最小 val_loss 值。

Epoch 00001: val_loss improved from ... to ..., saving model to ...

如何解决这种行为,以便每个模型迭代都以自己的回调清除值开始?

我尝试设置model.reset_states()和/或tf.keras.backend.clear_session()在循环中没有成功。

编辑

经过进一步调查,我发现回调发送的消息具有误导性。如果我verbose=0输入回调参数和verbose=2参数**model.fit**,我可以看到回调按预期工作。

标签: kerasdeep-learningcallbacktensorflow2.0early-stopping

解决方案


推荐阅读