TensorFlow - 使用dropout时如何复现结果

4

我正在使用dropout正则化训练神经网络。为了在获得好的结果时能够重复实验,我保存了网络初始化的权重和偏置。

然而,使用dropout会在网络中引入一些随机性:由于dropout随机地丢弃单元,每次重新运行网络时,不同的单元都会被丢弃 - 即使我使用完全相同的权重和偏置进行初始化(如果我理解正确的话)。

有没有办法使dropout变得确定性?

1个回答

4

在tensorflow中执行dropout有两种主要方法:

这两个函数都接受一个seed参数,用于生成随机掩码。默认情况下,seed=None,即随机种子,即非确定性。为了使结果具有确定性,您可以在每个操作级别上设置种子,或调用tf.set_random_seed(设置图级别的随机种子),或者更好地,两者都设置。

例如:

import tensorflow as tf

tf.InteractiveSession()
tf.set_random_seed(0)

x = tf.ones([10])
y = tf.nn.dropout(x, keep_prob=0.5, seed=0)
for i in range(5):
  print(y.eval())

z = tf.layers.dropout(inputs=x, rate=0.5, training=True, seed=0)
for i in range(5):
  print(z.eval())

注意:一般来说,在训练脚本中还有其他的随机源,因此您需要设置纯Python种子(random.seed)和NumPy种子(numpy.random.seed)。


1
完美,像魔法一样顺利!我希望它是这么简单的。 - rdv
2
设置图形种子和丢弃种子不会强制每次迭代始终放弃相同的输入吗? - Xema
@Xema,你找到答案了吗?在dropout层中进行种子操作是否确保随机采样相同的掩码?Maxim,你知道吗? - Rylan Schaeffer
甚至都不记得问题是什么了!那时我转向了PyTorch,再也没有回头。 - Xema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接