, -1)完成的。
我试图在我的张量中获得每个单独样本的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(