LoginSignup
3

More than 3 years have passed since last update.

posted at

tensorflowで同じコードなのに結果が異なる。再現性のある機械学習がしたい。

結果が異なる理由

1.理由は乱数を使っているから。
計算の度に乱数が異なるため結果が異なる。
2.GPUを使っているから。
GPU内部での演算順序が非決定的であるためGPU演算の結果は安定しない。

1解決策

下記のコードでnumpyとtensorflowの乱数を固定する。

import numpy as np
import tensorflow as tf
import random as rn

# The below is necessary in Python 3.2.3 onwards to
# have reproducible behavior for certain hash-based operations.
# See these references for further details:
# https://docs.python.org/3.4/using/cmdline.html#envvar-PYTHONHASHSEED
# https://github.com/keras-team/keras/issues/2280#issuecomment-306959926

import os
os.environ['PYTHONHASHSEED'] = '0'

# The below is necessary for starting Numpy generated random numbers
# in a well-defined initial state.

np.random.seed(42)

# The below is necessary for starting core Python generated random numbers
# in a well-defined state.

rn.seed(12345)

# Force TensorFlow to use single thread.
# Multiple threads are a potential source of
# non-reproducible results.
# For further details, see: https://stackoverflow.com/questions/42022950/which-seeds-have-to-be-set-where-to-realize-100-reproducibility-of-training-res

session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)

from keras import backend as K

# The below tf.set_random_seed() will make random number generation
# in the TensorFlow backend have a well-defined initial state.
# For further details, see: https://www.tensorflow.org/api_docs/python/tf/set_random_seed

tf.set_random_seed(1234)

sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)

# Rest of code follows ...

参考
https://keras.io/ja/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development

2解決策

なし

参考
https://qiita.com/TokyoMickey/items/63c4053740ab1f3f28a2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3