相关疑难解决方法(0)

TensorFlow:不可重复的结果

问题

我有一个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)

python random tensorflow

13
推荐指数
2
解决办法
5630
查看次数

使用tf.set_random_seed在Tensorflow中可重现的结果

我正在尝试生成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)

python reproducible-research random-seed tensorflow

10
推荐指数
4
解决办法
7158
查看次数

Tensorflow 1.8.0:宽和深模型结果不稳定.随机种子不起作用

我使用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)

从日志中,我可以看到未应用随机种子.

每当我运行脚本时,我都会得到不同的准确度结果.

如何使结果稳定?为什么随机种子没有被应用?

python machine-learning deep-learning tensorflow

5
推荐指数
1
解决办法
185
查看次数

如何在张量流中“重置”随机序列

我有一个包含 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)

python random deterministic tensorflow

5
推荐指数
0
解决办法
532
查看次数