【发布时间】: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 是空的,因此原则上不会影响添加所有这些损失。然而我只看到loss 和val_loss
任何想法如何解决这个问题?
谢谢
【问题讨论】:
-
我也遇到了同样的问题。你修好了吗?
-
不幸的是,到目前为止还没有。如果您知道这一点,请在此处添加评论。谢谢
标签: keras tensorflow2.0 image-segmentation loss-function matterport