Keras中图像分割的自定义指标

时间:2020-06-02 05:47:43

标签: tensorflow keras

我正在尝试打印和记录所有类别的自定义指标(骰子得分),以在培训期间进行验证。我希望Keras在每个时期后在验证集上计算自定义指标。我当前的程序正在运行,但是我必须使用一些技巧,这些技巧最终会在训练过程中导致内存问题。

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

我的自定义指标类如下:

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

请注意,变量lvrklksp是我的班级名称的缩写。

除了使用会话外,还有其他替代方法来打印和记录指标吗?

1 个答案:

答案 0 :(得分:1)

据我了解,temp_predicttemp_predict是numpy数组。因此,以张量结尾的唯一方法是因为您正在使用tf.reduce_mean。您可以将其替换为np.mean。仅当dice_coef没有张量流操作时,此方法才有效。如果确实如此,那么您将不得不用numpy函数替换它们。完成此操作后,就不必再打开新会话了。

您也可以使用intermediate_layer_model more about it here来构造一个keras函数,而不是在每个时期(tf.keras.backend.function)结束时创建一个新模型。