Keras MeanSquaredError 计算每个样本的损失
tensorflow 498
原文标题 :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’) 完全符合我的要求想要,那么有没有更类似的替代方案?
回复
我来回复-
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年前