我正在使用 dropout 正则化训练神经网络。我保存了初始化网络的权重和偏差,这样当我得到好的结果时我可以重复实验。
然而,dropout 的使用在网络中引入了一些随机性:由于 dropout 随机丢弃单元,每次我重新运行网络时,都会丢弃不同的单元——即使我用完全相同的权重和偏差初始化网络(如果我理解这一点正确)。
有没有办法使辍学具有确定性?
我正在使用 dropout 正则化训练神经网络。我保存了初始化网络的权重和偏差,这样当我得到好的结果时我可以重复实验。
然而,dropout 的使用在网络中引入了一些随机性:由于 dropout 随机丢弃单元,每次我重新运行网络时,都会丢弃不同的单元——即使我用完全相同的权重和偏差初始化网络(如果我理解这一点正确)。
有没有办法使辍学具有确定性?
在 tensorflow 中执行 dropout 有两种主要方法:
tf.nn.dropout
(低级)tf.layers.dropout
(高级,tf.nn.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
)。