Python Keras内置的2D数据MSE损失返回2D矩阵,而不是标量损失
我试图评估Keras中带有自动编码器(AE)的单个2D测试样本的MSE损失,一旦模型经过训练,我会惊讶地发现,当我调用Keras MSE内置函数获取单个样本的损失时,它会返回2D张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是它应该计算的每个样本的一个损失(?)。非常清楚的是,我希望MSE将所有像素上计算的平方误差的平均值与每个2D样本相关联(正如我读到的) 由于在使用Python Keras内置的2D数据MSE损失返回2D矩阵,而不是标量损失,python,tensorflow,keras,autoencoder,loss-function,Python,Tensorflow,Keras,Autoencoder,Loss Function,我试图评估Keras中带有自动编码器(AE)的单个2D测试样本的MSE损失,一旦模型经过训练,我会惊讶地发现,当我调用Keras MSE内置函数获取单个样本的损失时,它会返回2D张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是它应该计算的每个样本的一个损失(?)。非常清楚的是,我希望MSE将所有像素上计算的平方误差的平均值与每个2D样本相关联(正如我读到的) 由于在使用.predict()和.evaluate()对AE进行训练后,我没有获得每个测试样本一个标量的标量MSE错误数组(
.predict()
和.evaluate()
对AE进行训练后,我没有获得每个测试样本一个标量的标量MSE错误数组(可能我也遗漏了一些内容),因此我继续尝试直接使用keras.loss.mean_squared_error()
,逐个样本。这返回了2D张量作为每个样本的损失(输入张量的大小为(N,M,1)
)。当我们查看MSE损失的情况时,会发现:
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
轴=-1
解释了为什么在计算损失时多个维度不会立即减少为一个标量
因此,我想知道:
import keras
AE_testOutputs = autoencoder.predict(samplesList)
samplesMSE = []
for testSampleIndex in range(samplesList.shape[0]):
AE_output = AE_testOutputs[testSampleIndex,:,:,:]
samplesMSE.append(keras.losses.mean_squared_error(samplesList[testSampleIndex,:,:,:],AE_output))
它返回Tensor(“平均值:0”,shape=(15800),dtype=float64)
对象的列表samplesMSE
如果我错过了一个类似的问题,我很抱歉,我在发布之前做了积极的研究,我仍然担心有一个非常简单的解释/我一定错过了某个内置函数。虽然这不是绝对必需的,但Keras损失函数通常定义为“每个样本”,其中“样本”基本上是模型输出张量中的每个元素。然后,损耗函数通过一个包装函数,该函数增加了对掩蔽和样本加权的支持。默认情况下,总损失是样本损失的平均值
如果您想得到除第一个维度外的每个维度上某个值的平均值,只需在得到的值上使用
K.mean
。您所说的对我的-->1来说就是这个意思。是的,一个我不知道的包装函数实际上为我的每个2D样本计算像素SEs的平均值(“我期望的”)-->2。应用未包装版本的MSE Keras内置损耗(我在这个问题的代码示例中所做的)将不起作用,因为我的样本是2D性质的,为了获得测试样本的类似损耗,我需要使用像素SEs的2D平均值手动重新定义MSE损耗?我只是想确认一下,你说得对,谢谢你的回答@是的,没错。我的意思是,如果你不想重新定义损失函数,你可以做一些类似于keras.backend.mean(keras.loss.mean_squared_error(…)
的事情,它将计算整个张量的平均值。但是你也可以有你自己的MSE函数,因为它很简单。