Keras中的两个损失之和(感知和MSE)

时间:2019-01-05 19:04:18

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

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

1 个答案:

答案 0 :(得分: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才是损失的实际价值(将损失降到最低)。