Я использую модель Unet для сегментации двоичных изображений ['forest', 'no forest'].Я использую Keras с TF Backend.Я использую predict_generator()
с validation_data
из моего генератора, который выдает пакеты (изображения, маски)
. Я хочу использовать пользовательский обратный вызов с функцией on_epoch_end
, которая может хранить матрицу путаницы для каждогоэпоха (на validation_date
).Но когда я пытаюсь получить доступ к своему validation_data
, я получаю сообщение об ошибке "NoneTypeObject"
metric = Metrics()
model.fit_generator(myGene,
steps_per_epoch=100,
epochs=2,
verbose=1,
validation_data=val_gen,
validation_steps=100,
callbacks=[tbCallBack, model_checkpoint, metric]
class Metrics(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.confusion = []
self.precision = []
self.recall = []
self.f1s = []
self.kappa = []
self.global_cm = []
self.classes = ['forest', 'no forest']
def on_batch_end(self, batch, logs={}):
score = np.asarray(self.model.predict_on_batch(self.validation_data[0]))
predict = np.round(np.asarray(self.model.predict_on_batch(self.validation_data[0])))
predict = np.ravel(predict, order='C')
targ = self.validation_data[1]
targ = np.ravel(targ, order='C')
self.confusion.append(confusion_matrix(targ, predict))
self.precision.append(precision_score(targ, predict))
self.recall.append(recall_score(targ, predict))
self.f1s.append(f1_score(targ, predict))
self.kappa.append(cohen_kappa_score(targ, predict))
def on_train_end(self, logs={}):
self.confusion = np.asarray(self.confusion)
self.global_cm = np.sum(self.confusion, axis=0)
print(self.global_cm)
В первой строке on_epoch_end()
не удается получить доступ к validation_data[0]
, который соответствует пачке проверочных изображений.
score = np.asarray(self.model.predict_on_batch(self.validation_data[0]))
TypeError: 'NoneType' object is not subscriptable
Может быть, я должен написать собственную метрику keras вместо обратного вызова, но как я могу тогда вычислить матрицу путаницы в конце пакета и как получить пакет validation_data
?