Tensorflow Keras中图像分割的自定义度量
我试图打印并记录所有课程的自定义指标(骰子分数),以便在培训期间进行验证。我希望kera在每个历元之后计算验证集上的自定义度量。我目前的程序正在运行,但我必须使用一些技巧,这些技巧最终会在训练中导致记忆问题 问题是打印并记录所有类的骰子分数,计算是在我无法打印的张量上完成的。由于TensorFlow 2.0存在一些兼容性问题,我无法使用“急切”模式,并被迫初始化另一个会话 下面给出了我的自定义度量类:Tensorflow Keras中图像分割的自定义度量,tensorflow,keras,Tensorflow,Keras,我试图打印并记录所有课程的自定义指标(骰子分数),以便在培训期间进行验证。我希望kera在每个历元之后计算验证集上的自定义度量。我目前的程序正在运行,但我必须使用一些技巧,这些技巧最终会在训练中导致记忆问题 问题是打印并记录所有类的骰子分数,计算是在我无法打印的张量上完成的。由于TensorFlow 2.0存在一些兼容性问题,我无法使用“急切”模式,并被迫初始化另一个会话 下面给出了我的自定义度量类: class Metrics(tf.keras.callbacks.Callback):
class Metrics(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.val_lv = []
self.val_rk = []
self.val_lk = []
self.val_sp = []
def on_epoch_end(self, batch, logs={}):
layer_name = 'loss6'
self.intermediate_layer_model = tf.keras.models.Model(inputs=self.model.input,
outputs=self.model.get_layer(layer_name).output)
for batch_index in range(0, len(self.validation_data)):
temp_targ = self.validation_data[batch_index][1][0]
temp_targ=temp_targ.astype('float32')
temp_predict = (np.asarray( self.intermediate_layer_model.predict(
self.validation_data[batch_index][0]))).round()
val_lvs = tf.reduce_mean((dice_coef(temp_targ[:,1, :, :], temp_predict[:,1, :, :])))
val_rks = tf.reduce_mean(dice_coef(temp_targ[:, 2, :, :], temp_predict[:, 2, :, :]))
val_lks = tf.reduce_mean(dice_coef(temp_targ[:, 3, :, :], temp_predict[:, 3, :, :]))
val_sps = tf.reduce_mean(dice_coef(temp_targ[:, 4, :, :], temp_predict[:, 4, :, :]))
self.val_lv.append(val_lvs)
self.val_rk.append(val_rks)
self.val_lk.append(val_lks)
self.val_sp.append(val_sps)
sess = tf.Session()
print('liver-score:', sess.run(tf.reduce_mean(self.val_lv)))
print('rk-score:', sess.run(tf.reduce_mean(self.val_rk)))
print('lk-score:', sess.run(tf.reduce_mean(self.val_lk)))
print('sp-score:', sess.run(tf.reduce_mean(self.val_sp)))
logs['liver-score'] = sess.run(tf.reduce_mean(self.val_lv))
logs['rk-score'] = sess.run(tf.reduce_mean(self.val_rk))
logs['lk-score'] = sess.run(tf.reduce_mean(self.val_lk))
logs['sp-score'] = sess.run(tf.reduce_mean(self.val_sp))
sess.close()
return
请注意,变量lv
、rk
、lk
和sp
是我的类名的缩写
除了使用会话之外,还有其他打印和记录度量的方法吗 据我所知,
temp\u predict
和temp\u predict
是numpy数组。因此,得到张量的唯一方法是使用tf.reduce\u mean
。您可以将其替换为np.mean
。只有当dice\u coef
没有tensorflow操作时,这才有效。如果是这样,那么您将不得不用numpy函数替换它们。一旦你这样做了,你就不必打开新的会话了
此外,您还可以使用tf.keras.backend.function
构建keras函数,而不是在每个时代结束时创建新模型(intermediate\u layer\u model
)