使用Tensorflow后端运行Keras时如何获得可重现的结果

时间:2017-07-21 06:24:55

标签: tensorflow deep-learning keras lstm

每次我在jupyter笔记本中使用Keras运行LSTM网络时,我得到了不同的结果,我搜索了很多,我尝试了一些不同的解决方案,但它们都不起作用,这里有一些我试过的解决方案:

  1. 设置numpy随机种子

    random_seed=2017 from numpy.random import seed seed(random_seed)

  2. 设置张量流随机种子

    from tensorflow import set_random_seed set_random_seed(random_seed)

  3. 设置内置随机种子

    import random random.seed(random_seed)

  4. 设置PYTHONHASHSEED

    import os os.environ['PYTHONHASHSEED'] = '0'

  5. 在jupyter notebook kernel.json中添加PYTHONHASHSEED

    { "language": "python", "display_name": "Python 3", "env": {"PYTHONHASHSEED": "0"}, "argv": [ "python", "-m", "ipykernel_launcher", "-f", "{connection_file}" ] }

  6. 我的环境的版本是:

    Keras: 2.0.6
    Tensorflow: 1.2.1
    CPU or GPU: CPU
    

    这是我的代码:

    model = Sequential()
    model.add(LSTM(16, input_shape=(time_steps,nb_features), return_sequences=True))
    model.add(LSTM(16, input_shape=(time_steps,nb_features), return_sequences=False))
    model.add(Dense(8,activation='relu'))        
    model.add(Dense(1,activation='linear'))
    model.compile(loss='mse',optimizer='adam')
    

3 个答案:

答案 0 :(得分:3)

您的模型定义中肯定缺少种子。可以在此处找到详细的文档:https://keras.io/initializers/

本质上,您的图层使用随机变量作为其参数的基础。因此,每次都会得到不同的输出。

一个例子:

int main() {
  static int i = 5;
   if (--i) {
    printf("%d ", i);
    main();
  }
}

Keras本身有一个关于在其FAQ部分中获得可重现结果的部分:(https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development)。它们具有以下代码片段以产生可重现的结果:

model.add(Dense(1, activation='linear', 
               kernel_initializer=keras.initializers.RandomNormal(seed=1337),
               bias_initializer=keras.initializers.Constant(value=0.1))

答案 1 :(得分:0)

Keras + Tensorflow。

第1步,禁用GPU。

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""

第2步,植入代码中包含的库,例如“ tensorflow,numpy,random”。

import tensorflow as tf
import numpy as np
import random as rn

sd = 1 # Here sd means seed.
np.random.seed(sd)
rn.seed(sd)
os.environ['PYTHONHASHSEED']=str(sd)

from keras import backend as K
config = tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1)
tf.set_random_seed(sd)
sess = tf.Session(graph=tf.get_default_graph(), config=config)
K.set_session(sess)

确保这两段代码都包含在代码的开头,那么结果将是可重复的。

答案 2 :(得分:0)

我通过添加 os.environ['TF_DETERMINISTIC_OPS'] = '1'

解决了这个问题

这里有一个例子:

import os
os.environ['TF_DETERMINISTIC_OPS'] = '1'
#rest of the code
#TensorFlow version 2.3.1