Keras MSE定义

6

我偶然在Keras中看到了mse的定义,但找不到解释。

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

我原本期待的是按批次进行均值计算,即axis=0,但实际上它是axis=-1
我还尝试了一下,看看K.mean是否真的像numpy.mean那样行为良好。我一定是理解错了什么。请有人可以澄清一下吗?
我无法在运行时查看代价函数内部,对吧?据我所知,函数在编译时被调用,这样就阻止了我评估具体值。
我的意思是...想象一下做回归,并且只有一个输出神经元并使用批量大小为10来训练。
>>> import numpy as np
>>> a = np.ones((10, 1))
>>> a
array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])
>>> np.mean(a, axis=-1)
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

它所做的只是将数组压平,而不是对所有预测取平均值。
3个回答

3
K.mean(a, axis=-1)np.mean(a, axis=-1)仅计算最后一维度上的平均值。在这里,a是一个形状为(10, 1)的数组,并且在这种情况下,沿着最后一个维度取平均值恰好等于将其展平为形状为(10,)的一维数组。这样实现支持更通用的情况,例如多元线性回归。
此外,您可以使用keras.backend.print_tensor在运行时检查计算图中节点的值。请参阅答案:Is there any way to debug a value inside a tensor while training on Keras? 编辑:您的问题似乎是关于为什么损失不返回单个标量值,而是为每个批次中的数据点返回一个标量值。为了支持样本加权,Keras损失函数期望为批次中的每个数据点返回一个标量。有关详细信息,请参见losses documentationfitsample_weight参数。特别注意:“实际优化的目标是跨所有数据点输出数组的[加权]平均值。”

1
我知道它在做什么。我的问题是:它为什么这样做?第一个维度将是批量大小...那么为什么不沿着axis=0取平均值。 - Nima Mousavi

2
代码如下:
 def mean_squared_error(y_true, y_pred):
     return K.mean(K.square(y_pred - y_true), axis=-1)

选择轴为-1的一个应用示例是对于彩色图片,它有3个图层RGB。每个图层的大小为512乘以512像素,并存储在一个大小为512乘以512乘以3的对象中。

假设您的任务涉及重建图片并将其存储在另一个大小为512乘以512乘以3的对象中。

调用MSE将使您能够分析每个像素的重建任务的好坏程度。输出将是512乘以512的大小,总结了您在每个像素上的表现。


1

我和你有同样的问题。经过一些实验,我认为返回标量或张量作为损失并不重要,Keras(tensorflow)框架可以自动处理它。例如,如果您应用K.tf.reduce_mean()来获取标量而不是向量,则框架只需添加一个步骤来计算reduce_mean()的梯度。根据梯度链规则,结果不会受到影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接