【问题标题】:Sum of two losses in Keras (Perceptual and MSE)Keras 中两次损失的总和(感知和 MSE)
【发布时间】:2019-05-31 23:44:40
【问题描述】:

我想将目标函数中的感知损失添加到 MSE 损失中。我为此编写了以下代码:

def custom_objective(y_true, y_pred):

   tosub = K.constant([103.939, 116.779, 123.68])
   y1 = vgg_model(y_pred * 255. - tosub)
   y2 = vgg_model(y_true * 255. - tosub)
   loss2 = K.mean(K.square(y2 - y1), axis=-1)
   loss1 = K.mean(K.square(y_pred - y_true), axis=-1)
   loss = loss1 + loss2

return loss

问题是loss1 的形状类似于(BatchSize, 224, 224),但loss2 的形状是(BatchSize, 7, 7),所以它给了我关于不兼容形状的错误,这是正确的。我想知道如何正确添加这两个?我应该先解开吗?以及如何?

【问题讨论】:

    标签: machine-learning keras deep-learning conv-neural-network loss-function


    【解决方案1】:

    损失函数应该总是返回一个标量(批次中的每个样本或整个批次),因为我们想要最小化它(即你不能最小化一个向量,除非你定义你的意思是“最小化一个向量”)。因此,将其简化为标量的一种简单方法是在所有轴上取平均值,但在内部平均的批处理轴除外:

    loss2 = K.mean(K.square(y2 - y1), axis=[1,2,3])
    loss1 = K.mean(K.square(y_pred - y_true), axis=[1,2,3])
    loss = loss1 + loss2
    

    更新:让我澄清一下,如果损失函数返回一个向量甚至是一个 nD 数组(实际上上面的损失函数返回一个长度为batch_size 的向量),但保持不变请注意最后Keras takes the average of returned values,这就是损失的真正价值(将被最小化)。

    【讨论】:

    • 是的,谢谢。只是我想知道当输出是图像时,keras 本身会为均方误差返回非缩放器值,所以它会自动得到它们的总和或平均值?
    • @Panda 没错,正如您在内部提到的那样,即使损失函数返回一个向量,它也会对这些值进行平均。实际上,如果您有兴趣了解更多信息,我已经为此写了detailed answer
    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 2020-11-18
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多