在我的代码的开头,(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
尽管定义了一个操作和图表种子,为什么这个序列与第一个输出不同?
答案 0 :(得分:3)
答案已经在评论中提供,但是没有人明确地写过,所以这里是:
dynamic_rnn
将在内部使用tf.while_loop
,它实际上可以并行评估多个迭代(请参阅parallel_iterations
上的文档)。实际上,如果loop-body或loop-cond中的所有内容都取决于之前的值,则它不能并行运行任何内容,但可能存在不依赖于先前值的计算。这些将被并行评估。在你的情况下,在DropoutWrapper
内,你有点像这样:
random_ops.random_uniform(noise_shape, ...)
此操作独立于循环的先前值,因此可以并行计算所有时间步长。如果你进行这样的并行执行,那么哪个时间帧获得哪个丢失掩码将是不确定的。