代码如下:
import tensorflow as tfA = tf.constant([[0.1,0.2,0.3,0.4],[0.2,0.1,0.4,0.3],[0.4,0.3,0.2,0.1],[0.3,0.2,0.1,0.4],[0.1,0.4,0.3,0.2]], dtype=tf.float32)B = tf.constant([1, 2, 1, 3, 3], dtype=tf.int32)w_1 = tf.constant(value=[1,1,1,1,1], dtype=tf.float32)w_2 = tf.constant(value=[1,2,3,4,5], dtype=tf.float32)D = tf.contrib.legacy_seq2seq.sequence_loss_by_example([A], [B], [w_1])D_1 = tf.contrib.legacy_seq2seq.sequence_loss_by_example([A], [B], [w_1], average_across_timesteps=False)D_2 = tf.contrib.legacy_seq2seq.sequence_loss_by_example([A], [B], [w_2])D_3 = tf.contrib.legacy_seq2seq.sequence_loss_by_example([A], [B], [w_2], average_across_timesteps=False)with tf.Session() as sess: print(sess.run(D)) print(sess.run(D_1)) print(sess.run(D_2)) print(sess.run(D_3))
结果如下:
[1.4425355 1.2425355 1.3425356 1.2425356 1.4425356][1.4425355 1.2425355 1.3425356 1.2425356 1.4425356][1.4425355 1.2425355 1.3425356 1.2425356 1.4425356][1.4425355 2.485071 4.027607 4.9701424 7.212678 ]
我不明白为什么无论average_across_timesteps
参数设置为’True’还是’False’,结果都是一样的。
回答:
以下是执行平均操作的源代码:
if average_across_timesteps: total_size = math_ops.add_n(weights) total_size += 1e-12 # 只是为了避免所有权重为0时除以0的情况。 log_perps /= total_size
在你的例子中,weights
是一个包含一个张量的列表,要么是w_1
,要么是w_2
,也就是说,你只有一个时间步。在这两种情况下,tf.add_n(weights)
不会改变它,因为它是一个元素的总和(不是w_1
或w_2
中元素的总和)。
这解释了结果:D
和D_1
计算得到相同的数组,因为D_1 = D * w_1
(逐元素相乘)。D_2
和D_3
不同是因为w_2
不仅仅包含1。