繁体   English   中英

DropoutWrapper在运行中是不确定的?

[英]DropoutWrapper being non-deterministic across runs?

在我的代码的开头,(在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

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

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

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

random_ops.random_uniform(noise_shape, ...)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM