본문 바로가기

Deep Learning/Keras & Tensorflow

How to get reproducible results with Keras (or Tensorflow) ?

320x100
320x100

 

You can use Tensorflow-Determinism. Check this Link. Line 5 and 6 are important to set reprocibility of Keras.

import os
import random
import numpy as np
import tensorflow as tf
from tfdeterminism import patch
patch()
random_seed = 7
os.environ["PYTHONHASHSEED"] = "0"
os.environ['TF_DETERMINISTIC_OPS'] = '1'
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'
np.random.seed(random_seed)
random.seed(random_seed)
tf.set_random_seed(random_seed)

 

 이번 글은 외국인들한테도 도움이 됐으면 하는 마음에 제목과 내용 한 줄을 영어로 써봤다ㅋㅋㅋ 바로 본론으로 넘어가자. Keras-GPU or Tensorflow-GPU를 사용하시는 분들이라면 재현성 때문에 고생하신 분들이 많을 거라 생각한다. 같은 코드를 어떠한 수정 없이 반복해서 학습시킨 것 뿐인데 학습 결과가 다르게 나타난다. 흔히 알려진 tf.set_random_seed( ) 이랑 np.random.seed( ) 를 설정해줘도 성능이 왔다 갔다하는 현상을 마주하게 되면 아주 미칠 노릇이다. 이게 새로운 method를 적용해서 오른 건지.. 그냥 재현성이 안 잡혀서 오른 건지 알 길이 없기 때문이다. 

 

 사실 재현성과 관련해서는 몇 년 전에도 알아본 적이 있다. 그때만 해도 Tensorflow에서는 GPU의 randomness 잡아주는 기능이 없어서 재현성을 잡고 싶다면 Pytorch로 넘어가야한다는 결론을 냈었는데, 지금은 TF-Determinism을 사용하면 어느 정도는 잡히는 것 같다.

 

<      pip install tensorflow-determinism      >

 

 먼저 TF-Determinism을 설치하고서 위의 코드를 적용해주면 재현성이 잡힌 결과를 확인할 수 있을 것이다. 관련하여 자세한 내용을 알고싶다면 이곳에서 확인하자!

 

 


 

https://github.com/NVIDIA/framework-determinism/issues/24

https://github.com/NVIDIA/framework-determinism/issues/12

그래도 아직 해결 못 한 문제들이 남아있나보다.

유독 keras.layers.UpSampling2D( )를 사용하면 성능이 또 왔다 갔다 하길래 구글링 좀 해봤더니 

keras.layers.UpSampling2D( )는 재현성이 안 잡히는 이슈가 있다고 한다.

 

 

 

 

 

< 참고 사이트 >

https://hoya012.github.io/blog/reproducible_pytorch/

 

Reproducible PyTorch를 위한 randomness 올바르게 제어하기!

PyTorch 코드의 완벽한 재현을 위해 고려해야할 randomness를 제어하는 법을 설명드리겠습니다.

hoya012.github.io

https://github.com/NVIDIA/framework-determinism