Machine learning Keras中两个损失的总和(感知和MSE)

Machine learning Keras中两个损失的总和(感知和MSE),machine-learning,keras,deep-learning,conv-neural-network,loss-function,Machine Learning,Keras,Deep Learning,Conv Neural Network,Loss Function,我想将目标函数中的感知损失添加到MSE损失中。我为此编写了以下代码: def自定义目标(y_真,y_pred): tosub=K.常数([103.939116.779123.68]) y1=vgg_模型(y_pred*255.-tosub) y2=vgg_模型(y_真*255.-tosub) 损耗2=K.平均值(K.平方(y2-y1),轴=-1) loss1=K.平均值(K.平方(y_pred-y_true),轴=-1) 损耗=损耗1+损耗2 回波损耗 问题是loss1的形状类似于(Batch

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

def自定义目标(y_真,y_pred):
tosub=K.常数([103.939116.779123.68])
y1=vgg_模型(y_pred*255.-tosub)
y2=vgg_模型(y_真*255.-tosub)
损耗2=K.平均值(K.平方(y2-y1),轴=-1)
loss1=K.平均值(K.平方(y_pred-y_true),轴=-1)
损耗=损耗1+损耗2
回波损耗

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

损失函数应始终返回标量(批次中的每个样本或整个批次),因为我们希望最小化它(即,除非定义“最小化向量”的含义,否则无法最小化向量)。因此,将其简化为标量的一种简单方法是在所有轴上取平均值,但批处理轴除外,批处理轴在内部取平均值:

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

更新:让我澄清一下,如果损失函数返回一个向量,甚至是一个n-D数组(实际上,上面的损失函数返回一个长度为
批次大小的向量),这是可以的,但请记住,在最后,这是损失的真实值(可以最小化)。

是的,谢谢。我只想知道,当输出为image时,keras本身会返回均方误差的非定标值,因此它会自动得到它们的和或平均值?@Panda是的,正如您在内部提到的,它会平均值,即使损失函数返回向量。事实上,我已经写了一篇关于这方面的文章,如果你有兴趣了解更多的话。