【问题标题】:Matterport Mask R-CNN Tensorflow 2 - not seeing the individual losses, instead getting the training and validation losses onlyMatterport Mask R-CNN Tensorflow 2 - 没有看到个人损失,而是只获得训练和验证损失
【发布时间】:2021-09-25 03:51:12
【问题描述】:

我在 mrcnn/model.py 中做了一些修改,以使其与 TF2 协调一致,尤其是在函数 compile() 中:

def compile(self, learning_rate, momentum):
        """Gets the model ready for training. Adds losses, regularization, and
        metrics. Then calls the Keras compile() function.
        """
        self.keras_model.metrics_tensors = []
        # Optimizer object
        optimizer = keras.optimizers.SGD(
            lr=learning_rate, momentum=momentum,
            clipnorm=self.config.GRADIENT_CLIP_NORM)
        # Add Losses
        # First, clear previously set losses to avoid duplication
        self.keras_model._losses = []
        self.keras_model._per_input_losses = {}
        loss_names = [
            "rpn_class_loss",  "rpn_bbox_loss",
            "mrcnn_class_loss", "mrcnn_bbox_loss", "mrcnn_mask_loss"]

        for name in loss_names:
            layer = self.keras_model.get_layer(name)
            #if layer.output in self.keras_model.losses: # is this conflicting?
            #    continue
            loss = tf.reduce_mean(layer.output, keepdims=True) * self.config.LOSS_WEIGHTS.get(name, 1.)
            self.keras_model.add_loss(loss)

        # Add L2 Regularization
        # Skip gamma and beta weights of batch normalization layers.
        reg_losses = [
            keras.regularizers.l2(self.config.WEIGHT_DECAY)(w) / tf.cast(tf.size(w), tf.float32)
            for w in self.keras_model.trainable_weights
            if 'gamma' not in w.name and 'beta' not in w.name]
        self.keras_model.add_loss(tf.add_n(reg_losses))

        # Compile
        self.keras_model.compile(
            optimizer=optimizer,
            loss=[None] * len(self.keras_model.outputs))

        # Add metrics for losses
        for name in loss_names:
            if name in self.keras_model.metrics_names:
                continue
            layer = self.keras_model.get_layer(name)
            self.keras_model.metrics_names.append(name)
            loss = (
                tf.reduce_mean(layer.output, keepdims=True)
                * self.config.LOSS_WEIGHTS.get(name, 1.))
            self.keras_model.metrics_tensors.append(loss)

添加损失时,我注释掉了以下内容:

if layer.output in self.keras_model.losses: # is this conflicting?
   continue

因为那给了我一个错误。

我正在使用:

  • 张量流:2.2.0
  • keras:2.3.1
  • h5py: 2.10.0

因此,在我的训练期间,对于每个时期,而不是得到类似的东西:

Epoch 1/1
200/200 [==============================] - 612s 3s/step - loss: 2.8713 - rpn_class_loss: 0.2422 - rpn_bbox_loss: 0.7934 - mrcnn_class_loss: 0.3828 - mrcnn_bbox_loss: 0.7672 - mrcnn_mask_loss: 0.6857 - val_loss: 2.1704 - val_rpn_class_loss: 0.0662 - val_rpn_bbox_loss: 0.6589 - val_mrcnn_class_loss: 0.2957 - val_mrcnn_bbox_loss: 0.6043 - val_mrcnn_mask_loss: 0.5453

我只得到:

Epoch 1/6
200/200 [==============================] - 647s 3s/step - loss: 2.5905 - val_loss: 1.0897

据我了解,self.keras_model.losses 是空的,因此原则上不会影响添加所有这些损失。然而我只看到lossval_loss

任何想法如何解决这个问题?

谢谢

【问题讨论】:

  • 我也遇到了同样的问题。你修好了吗?
  • 不幸的是,到目前为止还没有。如果您知道这一点,请在此处添加评论。谢谢

标签: keras tensorflow2.0 image-segmentation loss-function matterport


【解决方案1】:

将 tensorflow 版本更改为 1.14。 rpn 和 mrcnn 损失将与训练和验证损失一起出现。

您可能很难降级版本。所以,我建议->

要创建一个虚拟环境-> 从matterport mrcnn github 安装 requirements.txt 模块-> 使用 matterport mrcnn 文件夹而不对您的代码进行任何更改-> 执行-> 您将在训练期间获得所有损失。

如果您收到属性错误,

AttributeError: 'Model' 对象没有属性 'metrics_tensors

你只需要在model.py文件中做如下修改:

修改self.keras_model.metrics_tensors.append(loss) -> self.keras_model.add_metric(loss, name)

祝你好运!

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 2019-11-29
    • 2017-08-14
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多