我有一个Python脚本,它使用TensorFlow创建一个多层感知器网络(带有丢失),以便进行二进制分类.即使我一直小心设置Python和TensorFlow种子,但我得到了不可重复的结果.如果我跑一次然后再跑,我会得到不同的结果.我甚至可以运行一次,退出Python,重新启动Python,再次运行并获得不同的结果.
我知道有些人发布了关于在TensorFlow中获得不可重复结果的问题(例如,"如何获得稳定的结果...","set_random_seed无效......","如何在TensorFlow中获得可重现的结果"),以及答案通常被证明是错误的使用/理解tf.set_random_seed().我已经确保实施所提供的解决方案,但这并没有解决我的问题.
一个常见的错误是没有意识到这tf.set_random_seed()只是一个图级别的种子,并且多次运行脚本会改变图形,解释不可重复的结果.我使用以下语句打印出整个图表并验证(通过差异)即使结果不同,图表也是相同的.
print [n.name for n in tf.get_default_graph().as_graph_def().node]
Run Code Online (Sandbox Code Playgroud)
我也使用函数调用,tf.reset_default_graph()并tf.get_default_graph().finalize()避免对图形进行任何更改,即使这可能是过度杀伤.
我的脚本长约360行,所以这里是相关的行(显示了剪切代码).ALL_CAPS中的任何项目都是在Parameters下面的块中定义的常量.
import numpy as np
import tensorflow as tf
from copy import deepcopy
from tqdm import tqdm # Progress bar
# --------------------------------- Parameters ---------------------------------
(snip)
# --------------------------------- Functions ---------------------------------
(snip)
# ------------------------------ Obtain Train Data -----------------------------
(snip)
# ------------------------------ Obtain Test Data -----------------------------
(snip)
random.seed(12345)
tf.set_random_seed(12345)
(snip)
# ------------------------- Build the …Run Code Online (Sandbox Code Playgroud) 我正在尝试生成N组独立的随机数。我有一个简单的代码,显示3组10个随机数的问题。我注意到,即使我使用tf.set_random_seed来设置种子,但不同运行的结果看起来也不相同。任何帮助或评论,我们将不胜感激。
(py3p6) bash-3.2$ cat test.py
import tensorflow as tf
for i in range(3):
tf.set_random_seed(1234)
generate = tf.random_uniform((10,), 0, 10)
with tf.Session() as sess:
b = sess.run(generate)
print(b)
Run Code Online (Sandbox Code Playgroud)
这是代码的输出:
# output :
[9.604688 5.811516 6.4159 9.621765 0.5434954 4.1893444 5.8865128
7.9785547 8.296125 8.388672 ]
[8.559105 3.2390785 6.447526 8.316823 1.6297233 1.4103293 2.647568
2.954973 6.5975866 7.494894 ]
[2.0277488 6.6134906 0.7579422 4.6359386 6.97507 3.3192968 2.866236
2.2205782 6.7940736 7.2391043]
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
[9.604688 5.811516 6.4159 9.621765 0.5434954 4.1893444 5.8865128
7.9785547 8.296125 8.388672 ]
[9.604688 5.811516 6.4159 …Run Code Online (Sandbox Code Playgroud) 我使用Tensorflow 1.8.0训练了一个宽而深的模型.我的测试和训练数据集是先前拆分的单独文件.我tf.set_random_seed(1234)之前使用tf.contrib.learn.DNNLinearCombinedClassifier如下 -
tf.set_random_seed(1234)
import tempfile
model_dir = tempfile.mkdtemp()
m = tf.contrib.learn.DNNLinearCombinedClassifier(model_dir=model_dir,
linear_feature_columns=wide_columns,
dnn_feature_columns=deep_columns,
dnn_hidden_units=[100, 50])
Run Code Online (Sandbox Code Playgroud)
它显示以下日志 -
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7f394b585c18>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'local', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_tf_config': gpu_options {
per_process_gpu_memory_fraction: 1.0
}
, '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': '/tmp/tmpxka6vy6t'}
Run Code Online (Sandbox Code Playgroud)
从日志中,我可以看到未应用随机种子.
每当我运行脚本时,我都会得到不同的准确度结果.
如何使结果稳定?为什么随机种子没有被应用?
我有一个包含 GB 变量的图和一个随机函数(例如 VAE)。我希望能够运行一个函数,并且始终使用相同的随机序列(例如,输入大量的 x,并且始终获得完全相同的 z 和 y)。
我可以使用随机种子来实现这一点,这样每次从头开始运行脚本(即初始化会话)时我总是得到相同的序列。不过,我希望能够在不破坏会话的情况下重置随机序列,这样我就可以一遍又一遍地调用我的函数(并获得相同的序列)。销毁并重新初始化会话并不是很理想,因为我丢失了 GB 的变量,并且每次重新加载都是浪费。再次设置随机种子(tf.set_random_seed)似乎没有影响(我认为来自 tf.set_random_seed 的种子以某种方式与操作种子结合并在创建时烘焙到操作中?)
有没有办法解决?
我已经阅读了有关张量流中随机种子的文档和大量帖子(例如TensorFlow:将种子重置为常量值不会产生重复结果,Tensorflow `set_random_seed` 不起作用,TensorFlow:不可重复结果,如何获得Tensorflow 中可重现的结果,如何使用 TensorFlow 获得稳定的结果,设置随机种子)但是我无法得到我想要的行为。
例如玩具代码
import tensorflow as tf
tf.set_random_seed(0)
a = tf.random_uniform([1], seed=1)
def foo(s, a, msg):
with s.as_default(): print msg, a.eval(), a.eval(), a.eval(), a.eval()
s = tf.Session()
foo(s, a, 'run1 (first session):')
# resetting seed does not reset sequence. is there anything else I can do?
tf.set_random_seed(0)
foo(s, a, 'run2 …Run Code Online (Sandbox Code Playgroud)