为什么损失函数不返回数字?

时间:2018-01-25 12:58:44

标签: keras

我正在尝试理解Keras中的损失函数,我看到典型损失函数的代码如下所示:

def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

我检查过,如果y_truey_pred是形状(a, b, c, d)的张量,则返回值是形状(a, b, c)的张量。

我的问题是:不应该是一个数值而不是一个张量?

2 个答案:

答案 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)

没有。均值被定义为与从

计算的事物序列的元素相同的东西