Train_generatorをフィッティングし、カスタムコールバックを使用して、validation_generatorでカスタムメトリックを計算します。カスタムコールバック内でvalidation_steps
およびvalidation_data
にアクセスするにはどうすればよいですか? self.params
にはありません。self.model
にもありません。これが私がやりたいことです。異なるアプローチを歓迎します。
model.fit_generator(generator=train_generator,
steps_per_Epoch=steps_per_Epoch,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_steps,
callbacks=[CustomMetrics()])
class CustomMetrics(keras.callbacks.Callback):
def on_Epoch_end(self, batch, logs={}):
for i in validation_steps:
# features, labels = next(validation_data)
# compute custom metric: f(features, labels)
return
ケラス:2.1.1
更新
検証データをカスタムコールバックのコンストラクターに渡すことができました。しかし、これは「カーネルが死んだように見えます。自動的に再起動します」という迷惑な結果になります。メッセージ。これが正しい方法かどうか疑問です。なにか提案を?
class CustomMetrics(keras.callbacks.Callback):
def __init__(self, validation_generator, validation_steps):
self.validation_generator = validation_generator
self.validation_steps = validation_steps
def on_Epoch_end(self, batch, logs={}):
self.scores = {
'recall_score': [],
'precision_score': [],
'f1_score': []
}
for batch_index in range(self.validation_steps):
features, y_true = next(self.validation_generator)
y_pred = np.asarray(self.model.predict(features))
y_pred = y_pred.round().astype(int)
self.scores['recall_score'].append(recall_score(y_true[:,0], y_pred[:,0]))
self.scores['precision_score'].append(precision_score(y_true[:,0], y_pred[:,0]))
self.scores['f1_score'].append(f1_score(y_true[:,0], y_pred[:,0]))
return
metrics = CustomMetrics(validation_generator, validation_steps)
model.fit_generator(generator=train_generator,
steps_per_Epoch=steps_per_Epoch,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_steps,
shuffle=True,
callbacks=[metrics],
verbose=1)
Self.validation_dataを直接反復処理して、各エポックの終わりにすべての検証データを集約できます。完全な検証データセット全体で精度、再現率、F1を計算する場合:
# Validation metrics callback: validation precision, recall and F1
# Some of the code was adapted from https://medium.com/@thongonary/how-to-compute-f1-score-for-each-Epoch-in-keras-a1acd17715a2
class Metrics(callbacks.Callback):
def on_train_begin(self, logs={}):
self.val_f1s = []
self.val_recalls = []
self.val_precisions = []
def on_Epoch_end(self, Epoch, logs):
# 5.4.1 For each validation batch
for batch_index in range(0, len(self.validation_data)):
# 5.4.1.1 Get the batch target values
temp_targ = self.validation_data[batch_index][1]
# 5.4.1.2 Get the batch prediction values
temp_predict = (np.asarray(self.model.predict(
self.validation_data[batch_index][0]))).round()
# 5.4.1.3 Append them to the corresponding output objects
if(batch_index == 0):
val_targ = temp_targ
val_predict = temp_predict
else:
val_targ = np.vstack((val_targ, temp_targ))
val_predict = np.vstack((val_predict, temp_predict))
val_f1 = round(f1_score(val_targ, val_predict), 4)
val_recall = round(recall_score(val_targ, val_predict), 4)
val_precis = round(precision_score(val_targ, val_predict), 4)
self.val_f1s.append(val_f1)
self.val_recalls.append(val_recall)
self.val_precisions.append(val_precis)
# Add custom metrics to the logs, so that we can use them with
# EarlyStop and csvLogger callbacks
logs["val_f1"] = val_f1
logs["val_recall"] = val_recall
logs["val_precis"] = val_precis
print("— val_f1: {} — val_precis: {} — val_recall {}".format(
val_f1, val_precis, val_recall))
return
valid_metrics = Metrics()
次に、valid_metricsをコールバック引数に追加できます。
your_model.fit_generator(..., callbacks = [valid_metrics])
他のコールバックでこれらのメジャーを使用する場合に備えて、コールバックの先頭に配置してください。
方法は次のとおりです。
from sklearn.metrics import r2_score
class MetricsCallback(keras.callbacks.Callback):
def on_Epoch_end(self, Epoch, logs=None):
if Epoch:
print(self.validation_data[0])
x_test = self.validation_data[0]
y_test = self.validation_data[1]
predictions = self.model.predict(x_test)
print('r2:', r2_score(prediction, y_test).round(2))
model.fit( ..., callbacks=[MetricsCallback()])
ケラス2.2.4
私は同じ問題の解決策を求めていましたが、受け入れられた答え here であなたと別の解決策を見つけました。 2番目の解決策が機能する場合、「エポック終了時」にすべての検証を繰り返し繰り返すよりも良いと思います
目的は、ターゲットおよびpredプレースホルダーを変数に保存し、「バッチ終了時」のカスタムコールバックを介して変数を更新することです。