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

如何在使用Tensorflow后端运行Keras时获得可重复的结果,tensorflow,deep-learning,keras,lstm,Tensorflow,Deep Learning,Keras,Lstm,每次我在jupyter笔记本电脑上用Keras运行LSTM网络时,我都会得到不同的结果,我在谷歌上搜索了很多,我尝试了一些不同的解决方案,但都不管用,以下是我尝试过的一些解决方案: 设置numpy随机种子 random_seed=2017 从numpy.random导入种子 种子(随机种子) 设置tensorflow随机种子 来自tensorflow导入集\u随机\u种子 设置随机种子(随机种子) 设置内置随机种子 随机导入 随机种子(随机种子) 设置蟒蛇种子 导入操作系统 os.environ

每次我在jupyter笔记本电脑上用Keras运行LSTM网络时,我都会得到不同的结果,我在谷歌上搜索了很多,我尝试了一些不同的解决方案,但都不管用,以下是我尝试过的一些解决方案:

  • 设置numpy随机种子

    random_seed=2017
    从numpy.random导入种子
    种子(随机种子)

  • 设置tensorflow随机种子

    来自tensorflow导入集\u随机\u种子
    设置随机种子(随机种子)

  • 设置内置随机种子

    随机导入
    随机种子(随机种子)

  • 设置蟒蛇种子

    导入操作系统
    os.environ['pythonhasheed']=“0”

  • 在jupyter notebook kernel.json中添加PYTHONHASHSEED

    {
    “语言”:“python”,
    “显示名称”:“Python 3”,
    “env”:{“pythonhasheed”:“0”},
    “argv”:[
    “python”,
    “-m”,
    “ipykernel_发射器”,
    “-f”,
    “{connection_file}”
    ]
    }

  • 我的环境版本是:

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

    模型定义中肯定缺少种子。详细文档可在此处找到:

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

    一个例子:

    model.add(Dense(1, activation='linear', 
                   kernel_initializer=keras.initializers.RandomNormal(seed=1337),
                   bias_initializer=keras.initializers.Constant(value=0.1))
    
    Keras自己在其FAQ部分中有一个关于获得可复制结果的部分:()。它们具有以下代码片段以生成可复制的结果:

    import numpy as np
    import tensorflow as tf
    import random as rn
    
    # The below is necessary in Python 3.2.3 onwards to
    # have reproducible behavior for certain hash-based operations.
    # See these references for further details:
    # https://docs.python.org/3.4/using/cmdline.html#envvar-PYTHONHASHSEED
    # https://github.com/fchollet/keras/issues/2280#issuecomment-306959926
    
    import os
    os.environ['PYTHONHASHSEED'] = '0'
    
    # The below is necessary for starting Numpy generated random numbers
    # in a well-defined initial state.
    
    np.random.seed(42)
    
    # The below is necessary for starting core Python generated random numbers
    # in a well-defined state.
    
    rn.seed(12345)
    
    # Force TensorFlow to use single thread.
    # Multiple threads are a potential source of
    # non-reproducible results.
    # For further details, see: https://stackoverflow.com/questions/42022950/which-seeds-have-to-be-set-where-to-realize-100-reproducibility-of-training-res
    
    session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
    
    from keras import backend as K
    
    # The below tf.set_random_seed() will make random number generation
    # in the TensorFlow backend have a well-defined initial state.
    # For further details, see: https://www.tensorflow.org/api_docs/python/tf/set_random_seed
    
    tf.set_random_seed(1234)
    
    sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
    K.set_session(sess)
    
    Keras+Tensorflow

    步骤1,禁用GPU

    import os
    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
    os.environ["CUDA_VISIBLE_DEVICES"] = ""
    
    第二步,为代码中包含的库添加种子,比如“tensorflow,numpy,random”


    确保在代码的开头包含这两段代码,然后结果将是可复制的。

    由于不同的原因(例如随机启动变量),结果可能会有所不同。因此,除非您提供一些模型代码,否则我们只能提供这么多帮助。请看一下我在使用CPU时在此处()的响应。您尚未接受任何答案。以下哪项对您有效,或者您是否找到了更好的解决方案?为清楚起见:keras.io FAQ使您可以为所有涉及的随机数生成器设定种子,因此无需为图层初始化额外提供种子参数以创建可复制的结果。(我的理解是,没有保证。)向每一层添加种子参数太多了,所以我们需要将上面的代码粘贴到笔记本的开头吗?由于来自非编程背景,我很难理解这段代码。它对我不起作用。我正在谷歌合作实验室使用tensorflow(1.14.0)中的keras(2.2.4-tf)。请推荐。
    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)