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/
https://github.com/NVIDIA/framework-determinism
'Deep Learning > Keras & Tensorflow' 카테고리의 다른 글
TF 버전 별 재현성 잡는 방법 정리 (1) | 2022.10.04 |
---|---|
Loss weight, Class weight, Sample weight (0) | 2022.05.02 |
Generative Adversarial Network (GAN) 설계 시 고려할 부분 (0) | 2021.10.08 |
ImgaeDataGenerator.flow_from_directory을 이용해 이미지 증식하는 방법 (0) | 2021.08.31 |
keras.models.Model( ) (0) | 2021.08.31 |