我正在使用dropout正则化训练神经网络。为了在获得好的结果时能够重复实验,我保存了网络初始化的权重和偏置。
然而,使用dropout会在网络中引入一些随机性:由于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
)。