Kerasフレームワークから_imdb_lstm.py
_サンプルを実行するたびに異なる結果(テスト精度)が得られます( https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py =)kerasがインポートされる前に、コードの上部にnp.random.seed(1337)
が含まれています。実行ごとに異なる数値を生成しないようにする必要があります。私は何が欠けていますか?
更新:再現方法:
更新2:MinGW/msys、モジュールバージョンを搭載したWindows 8.1で実行しています:
theano 0.7.0
numpy 1.8.1
scipy 0.14.0c1
更新3:問題を少し絞りました。 GPUでサンプルを実行すると(theanoフラグdevice = gpu0を設定)、毎回異なるテスト精度が得られますが、CPUで実行すると、すべてが期待どおりに機能します。私のグラフィックカード:NVIDIA GeForce GT 635)
答えはKerasのドキュメントで見つけることができます: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development =。
つまり、python script 1台のコンピューター/ラップトップのCPUで=を使用して再現可能な結果が得られることを確実に確認するには、次の手順を実行する必要があります。
PYTHONHASHSEED
環境変数を固定値に設定しますpython
組み込みの擬似乱数ジェネレーターを固定値に設定しますnumpy
擬似乱数ジェネレーターを固定値に設定しますtensorflow
擬似乱数ジェネレーターを固定値に設定しますtensorflow
セッションを構成する上部のKeras
リンクに従って、使用しているソースコードは次のとおりです。
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 0
# 1. Set the `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
# 2. Set the `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)
# 3. Set the `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)
# 4. Set the `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)
seed
、random_state
、またはnumpy
/tensorflow
でkeras
またはscikit-learn
を指定する必要がないことは言うまでもないpythonスクリプトで使用している関数は、上記のソースコードを使用して、疑似乱数ジェネレータをグローバルに固定値に設定しているためです。
Theanoの ドキュメント は、ランダム変数をシードすることの難しさと、各グラフインスタンスに独自の乱数ジェネレーターをシードする理由について説明しています。
異なる{{{RandomOp}}}インスタンス間で乱数ジェネレーターを共有すると、グラフ内の他のopsに関係なく同じストリームを生成することが難しくなり、{{{RandomOps}}}を分離した状態に保つことが難しくなります。したがって、グラフ内の各{{{RandomOp}}}インスタンスには、独自の乱数ジェネレーターがあります。その乱数ジェネレーターは、関数への入力です。通常の使用では、関数入力の新しい機能({{{value}}}、{{{update}}})を使用して、各{{{RandomOp}}}のrngを渡し、更新します。 RNGを入力として渡すことにより、関数入力にアクセスする通常の方法を使用して、各{{{RandomOp}}}のrngにアクセスできます。このアプローチでは、グラフ全体の結合された乱数状態を操作する既存のメカニズムはありません。したがって、提案は、補助機能を介して欠落している機能(最後の3つの要件)を提供することです:{{{seed、getstate、setstate}}}。
また、すべての乱数ジェネレーターのシード方法に関する examples も提供します。
また、RandomStreamsオブジェクトによって割り当てられたすべてのランダム変数を、そのオブジェクトのシードメソッドによってシードすることもできます。このシードは、一時的な乱数ジェネレータをシードするために使用されます。これにより、各ランダム変数のシードが生成されます。
>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each
私はついに自分のコードで再現可能な結果を得ました。それは私がウェブで見た答えの組み合わせです。最初のことは、@ alexの言うことをすることです。
numpy.random.seed
;PYTHONHASHSEED=0
を使用します。その後、次のTHEANO_FLAGS
を追加してKerasコードを呼び出すことにより、cuDNNに関する@ user2805751で指摘された問題を解決する必要があります。
dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic
最後に、 このコメント に従ってTheanoインストールにパッチを適用する必要があります。
*_dev20
演算子のすべての呼び出しをtheano/sandbox/cuda/opt.py
の通常バージョンに置き換えます。これにより、同じシードに対して同じ結果が得られます。
速度が低下する可能性があることに注意してください。実行時間は約10%増加しました。
以前の回答に何かを追加したいと思います。 pythonを使用し、実行ごとに再現可能な結果を取得する場合は、
Kerasを使用して、Sequential()
種類のニューラルネットワークをトレーニングおよびテストしました。ノイズの多い音声データに対して非線形回帰を実行しました。次のコードを使用して、ランダムシードを生成しました。
import numpy as np
seed = 7
np.random.seed(seed)
同じデータをトレーニングしてテストするたびに、val_loss
とまったく同じ結果が得られます。
前のコメントに同意しますが、再現可能な結果には、同じ環境(インストールされたパッケージ、マシンの特性など)が必要な場合があります。そのため、再現可能な結果を得るために、環境を他の場所にコピーすることをお勧めします。次のテクノロジーのいずれかを使用してみてください。
これは私のために働く:
SEED = 123456
import os
import random as rn
import numpy as np
from tensorflow import set_random_seed
os.environ['PYTHONHASHSEED']=str(SEED)
np.random.seed(SEED)
set_random_seed(SEED)
rn.seed(SEED)