我正在尝试理解Keras中的损失函数,我看到典型损失函数的代码如下所示:
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
我检查过,如果y_true
和y_pred
是形状(a, b, c, d)
的张量,则返回值是形状(a, b, c)
的张量。
我的问题是:不应该是一个数值而不是一个张量?
答案 0 :(得分:1)
由于框架(Keras,Tensorflow,Theano)使用张量来跟随从输入到损失结果的连接,所以任何结果都将是张量,即使它是具有形状(1,)的张量,表示标量。
除了其他方面,连接是必要的,以便能够根据损失函数的结果计算整个模型的梯度。
但为什么多维损失?
可能还有其他原因,但我能看到的主要是样本加权,除了使用keras损失函数作为更大函数的一部分。
如果您有不平衡的数据集,其中某些样本比其他样本更重要,您可以使用不同的权重为每个样本训练模型(使用sample_weight
方法中的fit
参数)。
然后Keras将在损失函数之后应用权重,为此需要在单个标量中折叠第一个维度。
稍后,它将采用损失函数中的结果的平均值,并在拟合方法的反馈中显示标量。
在另一种情况下,其他维度对你来说意味着什么,并且你希望它们在损失函数中扮演一个角色(或者即使你正在创建一个不打算丢失的自定义函数),你也是d能够使用后端功能而不会丢失尺寸:
from keras.losses import mean_squared_error
def myCustomLoss(y_true,y_pred):
mean = mean_squared_error(y_true,y_pred)
customLoss = doCrazyStuffWithSeparateDimensions(mean)
return customLoss
答案 1 :(得分:-2)
没有。均值被定义为与从
计算的事物序列的元素相同的东西