我正在一个项目中使用自定义回调和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])
我的实现中有什么问题?
答案 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不会被视为改善,并且将停止训练。