Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras自定义损失计算不正确_Python_Tensorflow_Machine Learning_Deep Learning_Keras - Fatal编程技术网

Python Keras自定义损失计算不正确

Python Keras自定义损失计算不正确,python,tensorflow,machine-learning,deep-learning,keras,Python,Tensorflow,Machine Learning,Deep Learning,Keras,我试图在Keras中使用自定义损失函数。我的实现类似于: class LossFunction: ... def loss(self, y_true, y_pred): ... localization_loss = self._localization_loss() confidence_loss = self._object_confidence_loss() category_loss = self._cat

我试图在Keras中使用自定义损失函数。我的实现类似于:

class LossFunction:
    ...

    def loss(self, y_true, y_pred):
        ...
        localization_loss = self._localization_loss()
        confidence_loss = self._object_confidence_loss()
        category_loss = self._category_loss()

        self.loc_loss = localization_loss
        self.obj_conf_loss = confidence_loss
        self.category_loss = category_loss

        tot_loss = localization_loss + confidence_loss + category_loss
        self.tot_loss = tot_loss
        return tot_loss
然后,我定义自定义度量以查看存储的张量,如:

class MetricContainer:
    def __init__(self, loss_obj):
        self.loss = loss_obj

    def local_loss(self, y_true, y_pred):
        return self.loss.loc_loss

    def confidence_loss(self, y_true, y_pred):
        return self.loss.obj_conf_loss

    def category_loss(self, y_true, y_pred):
        return self.loss.category_loss

    def tot_loss(self, y_true, y_pred):
        return self.loss.tot_loss
然后使用以下命令编译模型:

model.compile('adam', 
              loss=loss_obj.loss,
              metrics=[metric_container.local_loss, 
                       metric_container.confidence_loss, 
                       metric_container.category_loss, 
                       metric_container.tot_loss])
当我训练模型时(在一个非常小的训练集上),我得到如下输出:

Epoch 1/2
1/2 [==============>...............] - ETA: 76s - loss: 482.6910 - category_loss: 28.1100 - confidence_loss: 439.9192 - local_loss: 13.1180 - tot_loss: 481.1472 
2/2 [==============================] - 96s - loss: 324.6292 - category_loss: 18.1967 - confidence_loss: 296.0593 - local_loss: 8.8204 - tot_loss: 323.0764 - val_loss: 408.1170 - val_category_loss: 0.0000e+00 - val_confidence_loss: 400.0000 - val_local_loss: 6.5036 - val_tot_loss: 406.5036
由于某种原因,
tot_loss
loss
不匹配,即使我应该对它们使用相同的值


知道为什么会这样吗?Keras是否在您退还损失后对其进行了修改

您的损失等于所选损失函数和正则化项之和。因此,如果你使用任何形式的正则化,它会通过添加正则化项来影响你的损失。

看起来就是这样。我加载了一个预定义的模型,但没有意识到它的层附加了正则化损失。