3

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

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

有没有办法使辍学具有确定性?

4

1 回答 1

3

在 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)。

于 2018-03-08T15:59:57.630 回答