Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras内置的2D数据MSE损失返回2D矩阵,而不是标量损失_Python_Tensorflow_Keras_Autoencoder_Loss Function - Fatal编程技术网

Python Keras内置的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错误数组(

我试图评估Keras中带有自动编码器(AE)的单个2D测试样本的MSE损失,一旦模型经过训练,我会惊讶地发现,当我调用Keras MSE内置函数获取单个样本的损失时,它会返回2D张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是它应该计算的每个样本的一个损失(?)。非常清楚的是,我希望MSE将所有像素上计算的平方误差的平均值与每个2D样本相关联(正如我读到的)

由于在使用
.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
解释了为什么在计算损失时多个维度不会立即减少为一个标量

因此,我想知道:

  • 我的模型在培训期间到底使用了什么?是因为 如我所料,每个样本的所有像素的均方误差 ? 这不是内置代码所建议的
  • 我是否绝对需要重新定义MSE损失,以获得每个测试样本的单个MSE损失?获得标量I 然后必须将样本和相关的 预测,然后重新应用内置的MSE(以及此示例)
  • 根据Keras的MSE损失,在计算MSE之前需要手动展平。当我阅读这篇Mnist去噪教程时,对2D数据的AE模型使用MSE对我来说似乎很好

    我的代码:

    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函数,因为它很简单。