Tensorflow Keras中图像分割的自定义度量

Tensorflow Keras中图像分割的自定义度量,tensorflow,keras,Tensorflow,Keras,我试图打印并记录所有课程的自定义指标(骰子分数),以便在培训期间进行验证。我希望kera在每个历元之后计算验证集上的自定义度量。我目前的程序正在运行,但我必须使用一些技巧,这些技巧最终会在训练中导致记忆问题 问题是打印并记录所有类的骰子分数,计算是在我无法打印的张量上完成的。由于TensorFlow 2.0存在一些兼容性问题,我无法使用“急切”模式,并被迫初始化另一个会话 下面给出了我的自定义度量类: class Metrics(tf.keras.callbacks.Callback):

我试图打印并记录所有课程的自定义指标(骰子分数),以便在培训期间进行验证。我希望kera在每个历元之后计算验证集上的自定义度量。我目前的程序正在运行,但我必须使用一些技巧,这些技巧最终会在训练中导致记忆问题

问题是打印并记录所有类的骰子分数,计算是在我无法打印的张量上完成的。由于TensorFlow 2.0存在一些兼容性问题,我无法使用“急切”模式,并被迫初始化另一个会话

下面给出了我的自定义度量类:

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