Пользовательский метрический обратный вызов Keras: как получить доступ к val_data? - PullRequest
0 голосов
/ 30 апреля 2019

Я использую модель 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...