我在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
那样工作。我一定是误解了什么。能有人解释一下吗?
我实际上不能在运行时查看成本函数内部,对吗?据我所知,这个函数是在编译时调用的,这阻止了我评估具体的值。
我的意思是…想象一下进行回归,拥有一个输出神经元,并且以批量大小为十进行训练。
>>> import numpy as np>>> a = np.ones((10, 1))>>> aarray([[ 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.])
它所做的只是将数组展平,而不是取所有预测的均值。
回答:
K.mean(a, axis=-1)
和 np.mean(a, axis=-1)
只是在最后一个维度上取均值。这里的a
是一个形状为(10, 1)
的数组,在这种情况下,在最后一个维度上取均值与将其展平为形状为(10,)
的一维数组是相同的。这样实现是为了支持更一般的案例,例如多元线性回归。
此外,您可以在运行时使用keras.backend.print_tensor
检查计算图中节点的值。参见回答:在Keras训练时是否有办法调试张量内部的值?
编辑:你的问题似乎是关于为什么损失函数不返回单一标量值,而是为批次中的每个数据点返回一个标量值。为了支持样本加权,Keras的损失函数期望为批次中的每个数据点返回一个标量。参见损失函数文档和fit
的sample_weight
参数以获取更多信息。特别注意:“实际优化的目标是所有数据点的输出数组的[加权]均值。”