TensorFlowの再現性確保にかなり苦労したので残しておきます。

※)以下は ver1.13.1のtf.keras.Modelを使用し、fit()で実行しています。

shimizuはハイパーパラメータを試行錯誤するのに、ループの中で条件を変更して結果を一覧表示する方法をとっています。

mxnetの時は簡単で、ループの最初にseedをセットして再初期化するだけで上手くいきました。

np.random.seed(1234)
mx.random.seed(1234)

ところが、TensorFlowだとこれが上手くいきません・・・

色々と検索して出てきた方法を試してもダメでした。

ダメだった例

同じ条件でループしても、1回目と2回目で結果が異なるのです。
一度「TPUの速さが魅力なのでTensorFlowを使う」と決めたのですが、再現性の無さに耐えられなくなってきました。

例えばWeight Decayを変更して試行しても、それが本当にDecayの効果なのか確証が持てないからです。

最悪mxnetに戻ることを考えつつ、色々と試してみたところ

再現性確保できたーーー \(^_^)/

苦労のほどは置いておいて、簡単に結論だけ・・・

ループの最初にこの3行を書くだけでいけました

tf.keras.backend.clear_session()    # すべてを無に帰するために必要!!
np.random.seed(1234) 
tf.random.set_random_seed(1234)

以下の4行は不要でした。

random.seed(1234) 
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) 

もちろんモデルの再作成、コンパイルも毎回実行しています。

色々と試行錯誤した後だから簡単に言えるのですが

キモはclear_session()した後にseed設定する!ことです

最初逆にしていてうまく行かずあきらめていましたw

TPUでの実行結果(最初の例と同じ条件)

(再現性確認のため、浮動小数点の桁を増やしてあります)

これで安心してTensorFlowで研究を続けられます!

(おまけ)

GPUだと微妙に誤差が残るようです・・・


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です