我是不是需要在导入 numpy 或 tensorflow 的所有模块中设置种子?

Posted

技术标签:

【中文标题】我是不是需要在导入 numpy 或 tensorflow 的所有模块中设置种子?【英文标题】:Do I need to set seed in all modules where I import numpy or tensorflow?我是否需要在导入 numpy 或 tensorflow 的所有模块中设置种子? 【发布时间】:2020-07-09 14:50:09 【问题描述】:

我正在尝试使用kerastensorflow 作为后端来训练深度学习模型时产生可重复的结果。

我浏览了这个文档:https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development 在我用于训练的train.py 文件中设置 numpy、python 和 tf 的随机种子。

现在,这个文件从另外两个模块utils.pymodel.py 导入一些函数。在这两个文件中,我在顶部都有import numpy as npimport tensorflow as tf。我的问题是 - 从不同模块导入和设置随机种子如何工作?

a) 是否需要在 import 语句之后在每个文件中设置随机种子?

b) 或者,我是否只需要在 train.py 中设置这些种子并在这些设置种子命令之后从其他模块执行所有导入?

c) tf.set_random_seed(1) 是否也需要在 import tensorflow as tf 之后完成?

d) 我是否需要设置tf.set_random_seed(1),即使我没有导入 tensorflow 或 keras,而只是从 keras 导入层?

【问题讨论】:

【参考方案1】:

首先,使用 tensorflow.keras 代替 keras。

通常,通过以下方式在主脚本中使用种子就足够了。

import random
random.seed(1)
import numpy as np
np.random.seed(1)
import tensorflow as tf
tf.random.set_seed(1)

但是,如果您有多个模块并且它们有一些随机操作(例如权重初始化),那么将这些行添加到您的每个模块中。

此外,这些仅不能保证 100% 的可重复性,如果您使用的是 GPU,可能也会因此产生一些随机性。

您可以使用https://github.com/NVIDIA/tensorflow-determinism

os.environ['TF_DETERMINISTIC_OPS'] = '1'对于张量流==2.1.0

对于张量流

import tensorflow as tf
from tfdeterminism import patch
patch()

【讨论】:

如果我错了,请纠正我,os.environ['TF_DETERMINISTIC_OPS'] = '1'对于tensorflow==2.1.0,是否更换CPU的使用率?因为我目前有一个类似的问题,我的结果不一样,阅读了其他一些帖子,他们都建议使用 CPU 而不是 GPU。这个问题在 TensorFlow 2.1 中解决了吗? 不,github.com/tensorflow/tensorflow/pull/34887/files(它使 cuDNN 算法具有确定性)你可以看到它来自 NVIDIA,它实际上是用于 GPU 的。您应该查看github.com/NVIDIA/tensorflow-determinism repo,他们讨论了 GPU 确定性。但在训练过程中仍然可能存在一些概率因素。 感谢您提供的信息。因此,在 Keras + TensorFlow 中获得可重复性的唯一方法是使用 CPU 而不是 GPU? 是的,在这种情况下,CPU 可再现性是有保证的。但是,GPU 可能会有一些小问题。

以上是关于我是不是需要在导入 numpy 或 tensorflow 的所有模块中设置种子?的主要内容,如果未能解决你的问题,请参考以下文章

如何将加载 .sql 或 .csv 文件导入 SQLite?

BigQuery 是不是支持批量导入模板表?

不确定我是不是应该使用相对导入或将父目录添加到 sys.path [重复]

如果我已经在使用 Crashlytics,是不是需要在 Android Studio 中为 Fabric Answers 添加 gradle 导入?

如果我使用 JSX 语法,是不是需要“导入 React”?

刷新认知!这六种让 Python 程序变慢的坏习惯我一直在用