在Earlystopping回调中使用自定义回调时不起作用

时间:2019-09-27 13:43:05

标签: python-3.x tensorflow keras

我正在一个项目中使用自定义回调和Earlystopping回调,在这种情况下,我的模型训练甚至不会停止,val_loss并没有太大改善。

这是我的追求:

class CustomCallback(keras.callbacks.Callback):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def on_epoch_end(self, epoch, logs={}):
        y_pred = self.model.predict(self.x)
        error_rate =  np.sum(self.y == y_pred)
        print(f'Error number:: {error_rate}')
        logs['error_rate'] = error_rate


early_stop = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=2)
custom_callback = CustomCallback(X_data, y_data)


model.fit(train_data, y_train, epochs=100, batch_size=32, validation_data=(cv_data, y_cv), callbacks=[early_stop, custom_callback])

我的实现中有什么问题?

2 个答案:

答案 0 :(得分:0)

为什么不使用自定义指标而不是回调?

def error_rate(y_true, y_pred):
    rate = K.cast(K.equal(y_true, y_pred), K.floatx())
    return keras.backend.sum(rate)

您要传递标签号还是一个热张量y?通常情况下,它应该首先四舍五入(否则就不会有相等的结果)

def error_rate(y_true, y_pred):
    y_pred = K.cast(K.greater(y_pred, 0.5), K.floatx())
    ate = K.cast(K.equal(y_true, y_pred), K.floatx())
    return keras.backend.sum(rate)

将其用作指标:

model.compile(......, metrics=[error_rate, ...])   

答案 1 :(得分:0)

尝试通过 EarlyStopping 中的 min_delta 参数传递一些值,以使绝对变化小于min_delta不会被视为改善,并且将停止训练。