我正在使用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
批处理呢?