Python 为什么Kalas的损失只考虑输入数组的最后一个维度?

Python 为什么Kalas的损失只考虑输入数组的最后一个维度?,python,tensorflow,keras,Python,Tensorflow,Keras,在Keras存储库的当前master分支中,您可以在loss.py中找到这一点: def mean_absolute_error(y_true, y_pred): return K.mean(K.abs(y_pred - y_true), axis=-1) 请注意,由于使用了轴=-1,因此平均值仅沿阵列的最后一个轴y\u true和y\u pred计算 类似地,TensorFlow实现的内容如下: def mean_absolute_error(y_true, y_pred):

在Keras存储库的当前
master
分支中,您可以在
loss.py
中找到这一点:

def mean_absolute_error(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1)

请注意,由于使用了
轴=-1
,因此平均值仅沿阵列的最后一个轴
y\u true
y\u pred
计算

类似地,TensorFlow实现的内容如下:

def mean_absolute_error(y_true, y_pred):
  return K.mean(math_ops.abs(y_pred - y_true), axis=-1)

同一文件中定义的所有其他损失也是如此

为什么呢?(这是我的问题。)据我所知,损失是标量,所以为什么要保留一些数组维数

以下只是背景,不是我问题的一部分。 我偶然发现这一点的原因是,我试图在Keras中实现一些规范化的MAE,在没有更多考虑这个问题的情况下,我尝试了以下方法:

def normalized_mean_absolute_error(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1) / K.mean(K.abs(y_true), axis=-1)
这导致了
NaN
s,但可能(我仍在调查)是因为我试图将一个非标量数组除以另一个数组


编辑:我知道我的样本,即图像,在目标中有一些全零的行和列,这将导致这些行或列被零除。计算意味着一次在多个维度上进行计算,即它,保证不全为零的完整图像,解决了这个直接问题,但这仍然会提高这是上面的问题。)

你得到的是
Nan
,因为
K.mean(K.abs(y_true),axis=-1)
可能是零。所以你应该给这个denumerator添加一些小值(例如epsilon)。@Mitiku你是对的,但是除非我犯了一个严重的错误,否则我的任何样本(都是图像)应该全部为零。但是,某些行或列可能全部为零,这实际上可以解释观察到的行为。如果我的解释正确,这就提出了一个问题,为什么Keras会按一维而不是按样本计算损失。我不是这样做的,因为您使用的是
axis=-1
参数。您指定的是获取上一个轴的平均值@Mitiku我知道:)(请不要将我的问题动机与问题本身混淆。)问题(仍然)是,为什么Keras在其自身的损失实施中会这样做?您能否进一步澄清:为什么使用最后一个维度是未预期的?你的预测不是一维的吗?你得到的是
Nan
,因为
K.mean(K.abs(y\u true),axis=-1)
可能是零。所以你应该给这个denumerator增加一些小的值(例如epsilon)。@Mitiku你是对的,但是除非我犯了一个严重的错误,否则我的样本(图像)都不应该为零。不过,有些行或列可能全部为零,这实际上可以解释观察到的行为。如果我的解释是正确的,这就提出了一个问题,为什么Keras计算损失是一维的,而不是样本的,因为你使用的是
axis=-1
参数。您指定的是在最后一个坐标轴上获得平均值。@Mitiku我知道:)(请不要将我的问题动机与问题本身混淆。)问题(仍然)是,为什么Keras在其自己的损失实现中会这样做?您能否进一步澄清:为什么使用最后一个维度是未预期的?你的预测不是一维的吗?