Keras MeanSquaredError计算每个样本的损失



我试图在我的张量中获得每个单独样本的MeanSquaredError。

下面是一些示例代码来显示我的问题。

src = np.random.uniform(size=(2, 5, 10))
tgt = np.random.uniform(size=(2, 5, 10))
srcTF = tf.convert_to_tensor(src)
tgtTF = tf.convert_to_tensor(tgt)
print(srcTF, tgtTF)
lf = tf.keras.losses.MeanSquaredError(reduction=tf.compat.v1.losses.Reduction.NONE)
flowResults = lf(srcTF, tgtTF)
print(flowResults)

结果如下:

(2, 5, 10) (2, 5, 10)
(2, 5)

我想保持张量的所有原始维度,只计算单个样本的损失。在Tensorflow中有办法做到这一点吗?注意pytorch的torch.nn。MSELoss(reduction = 'none')正是我想要的,所以有一个更像那样的替代方案吗?

方法如下:

[ins] In [97]: mse = tf.keras.losses.MSE(tf.expand_dims(srcTF, axis=-1) , tf.expand_dims(tgtTF, axis=-1))                                                                 
                                                                                                      
[ins] In [98]: mse.shape                                                                                                                                                    
Out[98]: TensorShape([2, 5, 10])       
我认为这里的关键是样品。由于MSE是在最后一个轴上计算的,你失去了那个轴,因为它是被"减少"的。该五维向量中的每个点表示最后一个轴上10维的均方误差。为了恢复原来的形状,本质上,我们必须求每个标量的均方误差,为此我们需要扩展维度。本质上,我们说(2,5,10)是我们拥有的批次数量,每个标量是我们的样本/预测,这就是tf.expand_dims(, -1)完成的。

相关内容

  • 没有找到相关文章

最新更新