Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Keras Tensoflow完全复位_Loops_Tensorflow_Keras_Model_Reset - Fatal编程技术网

Loops Keras Tensoflow完全复位

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

我知道这个问题被很多人问了很多次,但我仍然没有任何有效的解决办法

我有一个Python代码,它倾向于创建一个模型,拟合它,然后预测一些东西。因为我有很多功能来训练模型,所以我创建了一个列表,列出了我所有功能的组合,比如10中的2个、10中的4个等等。现在我想在循环中调用我的代码

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)>]