web-dev-qa-db-ja.com

ケラで再現可能な結果を​​得る方法

Kerasフレームワークから_imdb_lstm.py_サンプルを実行するたびに異なる結果(テスト精度)が得られます( https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py =)kerasがインポートされる前に、コードの上部にnp.random.seed(1337)が含まれています。実行ごとに異なる数値を生成しないようにする必要があります。私は何が欠けていますか?

更新:再現方法:

  1. Kerasのインストール( http://keras.io/
  2. https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py を数回実行します。モデルをトレーニングし、テストの精度を出力します。
    期待される結果:テストの精度は実行ごとに同じです。
    実際の結果:テストの精度は実行ごとに異なります。

更新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)

59
Pavel Surmenok

答えはKerasのドキュメントで見つけることができます: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development =。

つまり、python script 1台のコンピューター/ラップトップのCPUで=を使用して再現可能な結果が得られることを確実に確認するには、次の手順を実行する必要があります。

  1. PYTHONHASHSEED環境変数を固定値に設定します
  2. python組み込みの擬似乱数ジェネレーターを固定値に設定します
  3. numpy擬似乱数ジェネレーターを固定値に設定します
  4. tensorflow擬似乱数ジェネレーターを固定値に設定します
  5. 新しいグローバル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)

seedrandom_state、またはnumpy/tensorflowkerasまたはscikit-learnを指定する必要がないことは言うまでもないpythonスクリプトで使用している関数は、上記のソースコードを使用して、疑似乱数ジェネレータをグローバルに固定値に設定しているためです。

23
Poete Maudit

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
13
PabTorre

私はついに自分のコードで再現可能な結果を​​得ました。それは私がウェブで見た答えの組み合わせです。最初のことは、@ alexの言うことをすることです。

  1. Set numpy.random.seed;
  2. Python 3.にPYTHONHASHSEED=0を使用します。

その後、次のTHEANO_FLAGSを追加してKerasコードを呼び出すことにより、cuDNNに関する@ user2805751で指摘された問題を解決する必要があります。

  1. dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic

最後に、 このコメント に従ってTheanoインストールにパッチを適用する必要があります。

  1. *_dev20演算子のすべての呼び出しをtheano/sandbox/cuda/opt.pyの通常バージョンに置き換えます。

これにより、同じシードに対して同じ結果が得られます。

速度が低下する可能性があることに注意してください。実行時間は約10%増加しました。

11
kepler

以前の回答に何かを追加したいと思います。 pythonを使用し、実行ごとに再現可能な結果を​​取得する場合は、

  1. コードの先頭にnumpy.random.seedを設定します
  2. pythonインタープリターのパラメーターとしてPYTHONHASHSEED = 0を指定します
1
Alex

Kerasを使用して、Sequential()種類のニューラルネットワークをトレーニングおよびテストしました。ノイズの多い音声データに対して非線形回帰を実行しました。次のコードを使用して、ランダムシードを生成しました。

import numpy as np
seed = 7
np.random.seed(seed)

同じデータをトレーニングしてテストするたびに、val_lossとまったく同じ結果が得られます。

1

前のコメントに同意しますが、再現可能な結果には、同じ環境(インストールされたパッケージ、マシンの特性など)が必要な場合があります。そのため、再現可能な結果を​​得るために、環境を他の場所にコピーすることをお勧めします。次のテクノロジーのいずれかを使用してみてください。

  1. Docker 。 Linuxを使用している場合は、環境を他の場所に非常に簡単に移動できます。 DockerHub を使用することもできます。
  2. バインダー 。これは、科学実験を再現するためのクラウドプラットフォームです。
  3. Everware 。これは、「再利用可能な科学」のためのさらに別のクラウドプラットフォームです。 Githubの project repository を参照してください。
0
Yelaman

これは私のために働く:

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