web-dev-qa-db-ja.com

TensorflowバックエンドでKerasを実行したときに再現可能な結果を​​得る方法

ジュピターノートブックで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ノートブックkernel.jsonにPYTHONHASHSEEDを追加します

    { "language": "python", "display_name": "Python 3", "env": {"PYTHONHASHSEED": "0"}, "argv": [ "python", "-m", "ipykernel_launcher", "-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')
10
176coding

シードがモデル定義から確実に欠落しています。詳細なドキュメントはここにあります: https://keras.io/initializers/

本質的に、レイヤーはパラメーターの基礎として確率変数を使用します。したがって、毎回異なる出力が得られます。

一例:

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

Keras自体には、再現可能な結果を​​取得するためのセクションがFAQセクション:( https://keras.io/getting-started/faq/#how-can-i-obtain -reproducible-results-using-keras-during-development )。再現可能な結果を​​生成するための次のコードスニペットがあります。

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)
4
Thomas Pinetz

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
guorui