DropoutWrapper在运行中是不确定的?

时间:2017-02-10 09:53:54

标签: python tensorflow

在我的代码的开头,(Session范围之外),我设置了随机种子 -

np.random.seed(1)
tf.set_random_seed(1)

这就是我的辍学定义 -

cell = tf.nn.rnn_cell.DropoutWrapper(cell, output_keep_prob=args.keep_prob, seed=1)

在我的第一个实验中,我保留了keep_prob=1。获得的所有结果都是确定性的。我在多核CPU上运行它。

在我的第二个实验中,我设置keep_prob=0.8并且我运行了相同的代码两次。每个代码都有这些陈述,

sess.run(model.cost, feed)
sess.run(model.cost, feed)

首次运行代码的结果 -

(Pdb) sess.run(model.cost, feed)
4.9555049
(Pdb) sess.run(model.cost, feed)
4.9548969

预期的行为,因为DropoutWrapper使用random_uniform

第二次代码运行的结果 -

(Pdb) sess.run(model.cost, feed)
4.9551616
(Pdb) sess.run(model.cost, feed)
4.9552417

尽管定义了一个操作和图表种子,为什么这个序列与第一个输出不同?

1 个答案:

答案 0 :(得分:3)

答案已经在评论中提供,但是没有人明确地写过,所以这里是:

dynamic_rnn将在内部使用tf.while_loop,它实际上可以并行评估多个迭代(请参阅parallel_iterations上的文档)。实际上,如果loop-body或loop-cond中的所有内容都取决于之前的值,则它不能并行运行任何内容,但可能存在不依赖于先前值的计算。这些将被并行评估。在你的情况下,在DropoutWrapper内,你有点像这样:

random_ops.random_uniform(noise_shape, ...)

此操作独立于循环的先前值,因此可以并行计算所有时间步长。如果你进行这样的并行执行,那么哪个时间帧获得哪个丢失掩码将是不确定的。