Keras MeanSquaredError 计算每个样本的损失

原文标题Keras MeanSquaredError calculate loss per individual sample

我试图在我的张量中获取每个单独样本的 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’) 完全符合我的要求想要,那么有没有更类似的替代方案?

原文链接:https://stackoverflow.com//questions/71983785/keras-meansquarederror-calculate-loss-per-individual-sample

回复

我来回复
  • Pritam Dodeja的头像
    Pritam Dodeja 评论

    这是一种方法:

    [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 维的均方误差。因此,为了恢复原始形状,本质上,我们必须对每个标量进行 MSE,为此我们需要扩展维度。本质上,我们说 (2, 5, 10) 是我们拥有的批次数,每个标量是我们的样本/预测,这就是 tf.expand_dims(, -1) 完成的。

    1年前 0条评论