Keras MSE定义

时间:2018-02-05 08:37:31

标签: python machine-learning neural-network deep-learning keras

我偶然发现了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 个答案:

答案 0 :(得分:2)

K.mean(a, axis=-1)以及np.mean(a, axis=-1)只是在最终维度上取平均值。这里a是一个形状为(10, 1)的数组,在这种情况下,取最终维度的平均值恰好与将其展平为形状(10,)的1d数组相同。像这样实现它支持更一般的例如多元线性回归。

此外,您可以使用keras.backend.print_tensor在运行时检查计算图中的节点值。见答案:Is there any way to debug a value inside a tensor while training on Keras?

编辑:您的问题似乎是为什么丢失不会返回单个标量值,而是返回批处理中每个数据点的标量值。为了支持样本加权,Keras损失预计会为批次中的每个数据点返回一个标量。有关详细信息,请参阅losses documentationfitsample_weight参数。请特别注意:“实际优化的目标是所有数据点上输出数组的[加权]均值。”

答案 1 :(得分:1)

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

答案 2 :(得分:1)

代码如下:

 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,从而总结了每个像素的性能。