Loops Keras Tensoflow完全复位
我知道这个问题被很多人问了很多次,但我仍然没有任何有效的解决办法 我有一个Python代码,它倾向于创建一个模型,拟合它,然后预测一些东西。因为我有很多功能来训练模型,所以我创建了一个列表,列出了我所有功能的组合,比如10中的2个、10中的4个等等。现在我想在循环中调用我的代码Loops Keras Tensoflow完全复位,loops,tensorflow,keras,model,reset,Loops,Tensorflow,Keras,Model,Reset,我知道这个问题被很多人问了很多次,但我仍然没有任何有效的解决办法 我有一个Python代码,它倾向于创建一个模型,拟合它,然后预测一些东西。因为我有很多功能来训练模型,所以我创建了一个列表,列出了我所有功能的组合,比如10中的2个、10中的4个等等。现在我想在循环中调用我的代码 The loop looks like: for each combination in all combinations: model = Sequential() ... add some laye
The loop looks like:
for each combination in all combinations:
model = Sequential()
... add some layers...
model.compile(...)
model.fit()
...
model.predict()
我发现每次我在同一组功能上运行它,我都会得到不同的结果。当然,我已经禁用了所有的随机性,所以这不是一个问题。如果我只是从命令行运行代码(没有循环,即python在两次运行之间完全退出),我会得到一个完全重复的结果
因此,我的假设是,Keras或/和Tensorflow不会在循环之间完全重置
我尝试过很多方法,比如在我希望丢弃模型后放上以下几行:
model.reset_states()
del model
gc.collect()
tf.keras.backend.set_learning_phase(1)
keras.backend.clear_session()
K.clear_session()
tf.compat.v1.reset_default_graph()
from tensorflow.python.framework import ops
ops.reset_default_graph()
没有任何效果-循环之间的结果不一致。正确工作的唯一方法是从一个批处理文件运行我的文件,该批处理文件有很多行,允许python在下次运行之前退出
有什么建议可以解决这个问题吗?我在Windows上使用TS 2.4.1和最新的keras
谢谢
我使用此代码来防止随机性:
def reset_random_seeds():
os.environ['PYTHONHASHSEED'] = str(1)
tf.random.set_seed(1)
np.random.seed(1)
random.seed(1)
TL;DR:您需要通过调用
tf.random.set\u seed
重置创建模型的循环中的随机生成器状态
说明:
神经网络由一系列数学运算组成。最常见的是,神经网络中的操作可以被视为以下线性方程:y=W*x+b
,其中:
是输入x
是输出y
是网络节点的权重W
是网络节点的偏差b
W
)是随机初始化的。这意味着每次你运行神经网络的训练,你会得到一个稍微不同的结果。如果您的模型足够健壮,那么这些结果在统计上是相似的
现在,如果想要重现一些精确的结果,权重的随机初始化可能是个问题。为了能够复制一些精确的数字,可以为随机生成器设置种子,从而保证在程序执行期间,生成的随机数始终来自同一序列,顺序相同
在终端中运行同一程序两次
考虑以下程序,名为network\u,带有\u seed.py
:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([tf.keras.layers.Dense(1,input_shape=(1,))])
print(model.trainable_weights)
import tensorflow as tf
tf.random.set_seed(0)
for idx in range(2):
print(f"Model {idx+1}")
model = tf.keras.Sequential([tf.keras.layers.Dense(1,input_shape=(1,))])
print(model.trainable_weights)
该程序是一个简单的网络,有一个完全连接的层和节点(也称为感知器)。该网络作为程序将打印的一个权重W
如果我们第一次执行该程序,我们会得到:
$ python network_with_seed.py
[<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-0.7206192]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
如果我们运行它
$ python loop_network_with_seed.py
Model 1
[<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-0.7206192]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
Model 2
[<tf.Variable 'dense_1/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[0.19195998]], dtype=float32)>, <tf.Variable 'dense_1/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
产出:
$ python network_with_seed_in_loop.py`
Model 1
[<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-0.7206192]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
Model 2
[<tf.Variable 'dense_1/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-0.7206192]], dtype=float32)>, <tf.Variable 'dense_1/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
$python network\u在\u loop.py中包含\u seed\u`
模式1
[, ]
模式2
[, ]
在这里,内部状态被重置,每个网络的内核
W
是相等的。当然,我已经禁用了所有随机性,所以这不是问题。
我很确定这就是问题所在。考虑一下感谢你的快速回复。我已经在帖子中添加了我用来禁用随机性的代码。如果我多次运行我的代码(不是在同一代码中的循环),我会得到相同的结果。只是当我在不退出Python的情况下运行它时,我得到了不同的结果。实际上,使用禁用随机性的代码解决了这个问题。非常感谢。嗨,我很快就回答了。事实上,我还在想我的情况会怎样。首先,在我的代码开始时,我使用以下代码“def reset_random_seeds():os.environ['PYTHONHASHSEED']=str(1)tf.random.set_seed(1)np.random.seed(1)random.seed(1)”禁用随机性问题是我在预测时没有得到随机结果。如果是这样的话,我会理解的。问题是,如果我在命令提示符下运行两次程序,我会得到完全相同的结果——我们称之为A。但是如果我在循环中运行两次,我会得到不同的结果A和结果B。但总是一样的。因此,在跑步之间,它似乎没有被清理干净。或者另一个问题——我是否需要在再次创建每个模型后调用该集合种子?我认为在我开始编写代码时只做一次就足够了。它是否在模型编译/拟合/预测周期中被重置?我添加了更多的解释,如果仍然不清楚,请告诉我。非常感谢您提供了这么好的答案。现在我看到每次创建模型时都需要设置相同的种子。出色的回答
import tensorflow as tf
for _ in range(2):
print(f"Model {idx+1}")
tf.random.set_seed(0)
model = tf.keras.Sequential([tf.keras.layers.Dense(1,input_shape=(1,))])
print(model.trainable_weights)
$ python network_with_seed_in_loop.py`
Model 1
[<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-0.7206192]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
Model 2
[<tf.Variable 'dense_1/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-0.7206192]], dtype=float32)>, <tf.Variable 'dense_1/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]