[英]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.