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だと微妙に誤差が残るようです・・・