第一个和第二个损失函数计算相同的东西,但方式略有不同。第三个函数计算完全不同的东西。您可以通过执行以下代码来看到这一点:
import tensorflow as tf
shape_obj = (5, 5)
shape_obj = (100, 6, 12)
Y1 = tf.random_normal(shape=shape_obj)
Y2 = tf.random_normal(shape=shape_obj)
loss1 = tf.reduce_sum(tf.pow(Y1 - Y2, 2)) / (reduce(lambda x, y: x*y, shape_obj))
loss2 = tf.reduce_mean(tf.squared_difference(Y1, Y2))
loss3 = tf.nn.l2_loss(Y1 - Y2)
with tf.Session() as sess:
print sess.run([loss1, loss2, loss3])
# when I run it I got: [2.0291963, 2.0291963, 7305.1069]
现在您可以通过注意到 tf.pow(a - b, 2) 与 tf.squared_difference(a - b, 2) 相同来验证 1-st 和 2-nd 计算相同的东西(理论上)。 reduce_mean 也与 reduce_sum / number_of_element 相同。问题是计算机无法准确计算所有内容。要了解数值不稳定性会对您的计算造成什么影响,请查看以下内容:
import tensorflow as tf
shape_obj = (5000, 5000, 10)
Y1 = tf.zeros(shape=shape_obj)
Y2 = tf.ones(shape=shape_obj)
loss1 = tf.reduce_sum(tf.pow(Y1 - Y2, 2)) / (reduce(lambda x, y: x*y, shape_obj))
loss2 = tf.reduce_mean(tf.squared_difference(Y1, Y2))
with tf.Session() as sess:
print sess.run([loss1, loss2])
很容易看出答案应该是 1,但你会得到这样的结果:[1.0, 0.26843545]。
关于你的最后一个功能,文档说:
计算没有 sqrt 的张量 L2 范数的一半: output = sum(t
** 2) / 2
因此,如果您希望它(理论上)计算与第一个相同的东西,则需要适当地对其进行缩放:
loss3 = tf.nn.l2_loss(Y1 - Y2) * 2 / (reduce(lambda x, y: x*y, shape_obj))