Keras 中两种损失的总和(感知和 MSE)

Sum of two losses in Keras (Perceptual and MSE)

我想在 objective 函数中将感知损失添加到 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),所以它给我关于不兼容形状的错误是正确的。我想知道如何正确添加这两个?我应该先解开吗?以及如何?

损失函数应始终 return 标量(批次中的每个样本或整个批次中的每个样本),因为我们想要最小化它(即你不能最小化向量,除非你定义了什么你的意思是 "minimizing a vector")。因此,将其简化为标量的一种简单方法是取所有轴的平均值,但内部平均的批处理轴除外:

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

更新:让我澄清一下,如果损失函数return是一个向量甚至是一个n维数组(实际上是上面的损失函数returns 是一个长度为 batch_size 的向量,但请记住,最后 是损失的实际值(将被最小化)。