如何使用TensorFlow设置随机种子获得稳定的结果
numpy
python
tensorflow
16
0

我正在尝试使用不同的参数多次运行神经网络,以便校准网络参数(辍学概率,学习率ed)。但是我遇到的问题是,当我按如下所示循环运行网络时,在保持参数不变的情况下运行网络仍然为我提供了不同的解决方案:

filename = create_results_file()
for i in range(3):
  g = tf.Graph()
  with g.as_default():
    accuracy_result, average_error = network.train_network(
        parameters, inputHeight, inputWidth, inputChannels, outputClasses)
    f, w = get_csv_writer(filename)
    w.writerow([accuracy_result, "did run %d" % i, average_error])
    f.close()

在设置网络的层和错误功能之前,我在train_network函数的开头使用了以下代码:

np.random.seed(1)
tf.set_random_seed(1)

我还尝试在TensorFlow图形创建之前添加此代码,但是在结果输出中我不断获得不同的解决方案。

我正在使用AdamOptimizer并使用tf.truncated_normal初始化网络权重。另外,我正在使用np.random.permutation来随机播放每个时期的传入图像。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

请在代码之前添加所有随机种子函数:

tf.reset_default_graph()
tf.set_random_seed(0)
random.seed(0)
np.random.seed(0)

我认为,TensorFlow中的某些模型正在使用numpy或python random函数。

收藏
评论

确定性行为可以通过提供图形级种子或操作级种子来获得。两者都为我工作。可以使用tf.set_random_seed放置图级种子。可以将操作级别的种子放置在例如变量初始化器中,例如:

myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0))
收藏
评论

设置当前TensorFlow随机种子仅影响当前默认图。由于要为训练创建一个新图并将其设置为默认图( with g.as_default(): ,因此必须在with block的范围内设置随机种子。

例如,您的循环应如下所示:

for i in range(3):
  g = tf.Graph()
  with g.as_default():
    tf.set_random_seed(1)
    accuracy_result, average_error = network.train_network(
        parameters, inputHeight, inputWidth, inputChannels, outputClasses)

请注意,这将为外部for循环的每次迭代使用相同的随机种子。如果要在每次迭代中使用tf.set_random_seed(i + 1)但仍是确定性的)种子,则可以使用tf.set_random_seed(i + 1)

收藏
评论

Tensorflow 2.0兼容答案 :对于大于2.0的Tensorflow版本,如果要设置全局随机种子,则使用的命令为tf.random.set_seed

如果要从Tensorflow Version 1.x to 2.x迁移Tensorflow Version 1.x to 2.x ,则可以使用命令tf.compat.v2.random.set_seed

请注意,在这种情况下, tf.function就像重新运行程序一样。

要设置操作级别种子(如上回答),我们可以使用命令tf.random.uniform([1], seed=1)

有关更多详细信息,请参见此Tensorflow页面

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题