web-dev-qa-db-ja.com

TensorFlowバックエンドでKerasを使用した再現性のある結果

私はKerasを使用して、TensorFlowバックエンドを使用してディープラーニングLSTMモデルを構築しています。モデルを実行するたびに、結果は異なります。再現性のある結果を作成するためにシードを修正する方法はありますか?ありがとうございました!

8
Edamame

@Poete_Mauditがここで言ったように: ケラスで再現可能な結果を​​得る方法

再現性のある結果を得るには、スクリプトの最初で次のことを行う必要があります(単一のCPUを使用するように強制されます):

# Seed value (can actually be different for each attribution step)
seed_value= 0

# 1. Set `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)

# 2. Set `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)

# 3. Set `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)

# 4. Set `tensorflow` pseudo-random generator at a fixed value
import tensorflow as tf
tf.set_random_seed(seed_value)

# 5. Configure a new global `tensorflow` session
from keras import backend as K
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)

注:コマンドを使用して(もう)再現可能な結果を​​取得することはできません:PYTHONHASHSEED=0 python3 script.py、as https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development 考えさせられるかもしれませんが、ステップ1のように、スクリプト内でos.environを使用してPYTHONHASHSEEDを設定する必要があります。また、これはGPUの使用では機能しません。

5

深い学習に関連する固有のランダム性があり、再現性のない結果につながりますが、ある程度まで制御することができます。

ディープニューラルネットワークを使用しているため、再現性に影響を与えるさまざまなランダム性があり、次のようなさまざまな結果につながる可能性があります。

  • 重みなどの初期化のランダム性。

  • ドロップアウトなどの正則化のランダム性。

  • レイヤーのランダム性。

  • 最適化におけるランダム性。

ただし、この1つのオプションを軽減する方法はいくつかあり、要約統計量を使用することです。より再現性の高い結果を提供する別の方法は、numpyおよび/またはtensorflowを含むランダムシードを使用することです。以下を参照してください。

https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.random.seed.html

https://www.tensorflow.org/api_docs/python/tf/set_random_seed

GPUsを使用しているメソッドについては、デフォルトの非決定論的方法の代わりに決定論的方法を使用するように指定できます。nvidiaグラフィックカードについては、以下を参照してください。 docs.nvidia.com/cuda

2
codeslord

基本的に、結果を再現可能にするための重要なアイデアは、GPUを無効にするです。これは非常に重要です。これを行うには、

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

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

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)

コードの最初の部分。これがお役に立てば幸いです。

0
guorui