TensorFlow - 使用 dropout 重现结果
TensorFlow - reproducing results when using dropout
我正在使用 dropout 正则化训练神经网络。我保存了网络初始化时使用的权重和偏差,以便在获得好的结果时可以重复实验。
但是,dropout 的使用在网络中引入了一些随机性:由于 dropout 随机丢弃单元,每次我重新运行网络时,都会丢弃不同的单元 - 即使我使用完全相同的权重和偏差初始化网络(如果我理解正确的话)。
有没有办法让 dropout 具有确定性?
在tensorflow中执行dropout主要有两种方式:
tf.nn.dropout
(low-level)
tf.layers.dropout
(high-level,在后台使用 tf.nn.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
)。
我正在使用 dropout 正则化训练神经网络。我保存了网络初始化时使用的权重和偏差,以便在获得好的结果时可以重复实验。
但是,dropout 的使用在网络中引入了一些随机性:由于 dropout 随机丢弃单元,每次我重新运行网络时,都会丢弃不同的单元 - 即使我使用完全相同的权重和偏差初始化网络(如果我理解正确的话)。
有没有办法让 dropout 具有确定性?
在tensorflow中执行dropout主要有两种方式:
tf.nn.dropout
(low-level)tf.layers.dropout
(high-level,在后台使用tf.nn.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
)。