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
的向量,但请记住,最后 是损失的实际值(将被最小化)。
我想在 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
的向量,但请记住,最后