Я заинтересован в создании обратного вызова при настройке моей модели keras. Более подробно я бы хотел получать сообщение от бота-телеграммы с val_acc каждый раз, когда эпоха закончилась. Я знаю, что вы можете добавить callback_list в качестве параметра в classifier.fit()
, но многие обратные вызовы предварительно созданы keras, и я не знаю, как добавить собственный.
Спасибо!
Вот пример того, как я бы добавил точность проверки к обратному вызову:
class AccuracyHistory(keras.callbacks.Callback):
def on_train_begin(self, logs = {}):
self.acc = []
def on_epoch_end(self, batch, logs = {}):
self.acc.append(logs.get('val_acc'))
history = AccuracyHistory()
model.fit(x, y,
...
callbacks=[history])
В качестве примера я предоставляю свой собственный обратный вызов с метрикой F1. Он вычисляет F1 в конце каждой эпохи не пакетно, а для ВСЕХ переданных данных поезда (и, возможно, также для проверки). Его можно легко настроить с любой другой метрикой
class F1History(tf.keras.callbacks.Callback):
def __init__(self, train, validation=None):
super(F1History, self).__init__()
self.validation = validation
self.train = train
def on_epoch_end(self, epoch, logs = {}):
logs['F1_score_train'] = float('-inf')
X_train, y_train = self.train[0], self.train[1]
y_pred = (self.model.predict(X_train).ravel()>0.5)+0
score = f1_score(y_train, y_pred)
if (self.validation):
logs['F1_score_val'] = float('-inf')
X_valid, y_valid = self.validation[0], self.validation[1]
y_val_pred = (self.model.predict(X_valid).ravel()>0.5)+0
val_score = f1_score(y_valid, y_val_pred)
logs['F1_score_train'] = np.round(score, 5)
logs['F1_score_val'] = np.round(val_score, 5)
else:
logs['F1_score_train'] = np.round(score, 5)
для примерки:
es = EarlyStopping(patience=3, verbose=1, min_delta=0.001, monitor='F1_score_val', mode='max', restore_best_weights=True)
model.fit(x_train,y_train, epochs=10,
callbacks=[F1History(train=(x_train,y_train),validation=(x_val,y_val)),es])
Во время обучения модели вы можете выполнять любые действия. для этой цели Керас предоставил следующие методы:
on_train_begin, on_train_end, on_epoch_begin, on_epoch_end, on_test_begin,
on_test_end, on_predict_begin, on_predict_end, on_train_batch_begin, on_train_batch_end,
on_test_batch_begin, on_test_batch_end, on_predict_batch_begin,on_predict_batch_end
Пример:
Если вы хотите делать прогнозы на тестовых данных в конце каждой эпохи, используя обучаемую модель, вы можете сделать это, используя следующий код
class CustomCallback(keras.callbacks.Callback):
def __init__(self, model, x_test, y_test):
self.model = model
self.x_test = x_test
self.y_test = y_test
def on_epoch_end(self, epoch, logs = {}):
y_pred = self.model.predict(self.x_test, self.y_test)
print('y predicted: ', y_pred)
Вам нужно упомянуть обратный вызов во время model.fit
model.sequence()
# your model architecture
model.fit(x_train, y_train, epochs=10,
callbacks=[CustomCallback(model, x_test, y_test)])