Keras自定义指标回调:如何访问val_data?

时间:2019-04-30 07:38:35

标签: tensorflow keras

我正在使用Unet模型进行二进制图像分割['forest','no forest']。 我将Keras与tf后端一起使用。 我使用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批处理呢?

0 个答案:

没有答案