TensorflowやKerasで乱数シードを固定して同じ結果が出るようにする

機械学習やディープラーニングに取り組む時、様々なモデルを作って精度を比較することが多い。

しかし、TensorflowやKerasではGPUを用いた学習の時に乱数を固定する方法がなく、結果が変わってもモデルの改良によるものなのか乱数による偶然なのかがはっきりしない。

CPUでの学習やPyTorchに切り替えれば乱数シードを固定できるのだが、時間がかかってしまう。

何かないかなーと調べてみると、GPUでも乱数シードを固定する追加パッチのようなものが見つかった。

NVIDIA/framework-determinism
Providing determinism in deep learning frameworks. Contribute to NVIDIA/framework-determinism development by creating an account on GitHub.

pipでインストール出来る。

pip install tensorflow-determinism

tensorflowが2.3.0なら環境変数をセットするだけでOK。

import tensorflow as tf
import os
os.environ['TF_DETERMINISTIC_OPS'] = '1'
# Now build your graph and train it

tensorflowが2.1以下なら

import tensorflow as tf
from tfdeterminism import patch
patch()
# use tf as normal

手元にあるコードを複数回実行してみる。

FOLD 1 / 5 loss: 0.0158931
FOLD 2 / 5 loss: 0.0160515
FOLD 3 / 5 loss: 0.0159398
FOLD 4 / 5 loss: 0.0155535
FOLD 5 / 5 loss: 0.0158922

FOLD 1 / 5 loss: 0.0158931
FOLD 2 / 5 loss: 0.0160515
FOLD 3 / 5 loss: 0.0159398
FOLD 4 / 5 loss: 0.0155535
FOLD 5 / 5 loss: 0.0158922

FOLD 1 / 5 loss: 0.0158931
FOLD 2 / 5 loss: 0.0160515
FOLD 3 / 5 loss: 0.0159398
FOLD 4 / 5 loss: 0.0155535
FOLD 5 / 5 loss: 0.0158922

ちゃんと同じ結果が出力されるようになった。

これで乱数による結果のぶれを気にせず、モデルのチューニングと結果の変化が対応付け出来るようになった。

コメント

タイトルとURLをコピーしました