TensorFlow - 使用 dropout 重现结果

TensorFlow - reproducing results when using dropout

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

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

有没有办法让 dropout 具有确定性?

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

两个函数都接受用于生成随机掩码的 seed 参数。默认情况下,seed=None,表示随机种子,即non-deterministic。为了使结果具有确定性,您可以将种子设置为 per-op 级别或调用 tf.set_random_seed(设置 graph-level 随机种子),或者更好的是,两者都设置。

示例:

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) and numpy seed (numpy.random.seed)。