본문 바로가기
카테고리 없음

네트웍으로부터 동일한 결과 얻기 (tensorflow)

by 부자독개 2020. 5. 20.
반응형

https://www.facebook.com/groups/TensorFlowKR/permalink/957605937913798/

 

김승환

일반적으로 난수를 발생할 때, 난수의 초기값으로 현재 시각을 사용한다. 현재, 시간은 매번 다르기 때문에 출력되는 난수가 매번 다르게 나온다. 때로는 프로그램 시행마다 같은 결과를 나와야

www.facebook.com

   네트워크를 새로 훈련시킬때마다 왜 결과가 다르냐는 말에 웨이트와 바이어스의 초기값설정이 랜덤이기 때문이라고 답을했습니다. 그런데 막상 초기값을 고정시켰는데도 결과가 달라 왜그런지 코드를 다시한번 분석해봤습니다.

 

   웨이트 초기화 이외에 랜덤성분으로 생각되는 드랍아웃을 1.0으로 고정시키고 에포크마다 트레인 셋을 셔플해주는것 또한 고정시켰습니다. 더이상은 내가 짠 코드상에 랜덤성분은 없을것으로 판단했습니다. 하지만 실험을 해본 결과는 항상 바뀌다는 것이었습니다.. 

 

 여러가지 테스트를 하다보니 tensorflow-cpu와 gpu에서 차이가 있는것을 보았습니다. cpu버전의 경우에는 고정된 결과값이 나오는것을 알수있었습니다. 

 

cpu 기준 

- 에포크마다 트레인셋을 셔플해주면 결과가 랜덤해진다.

- 트레인 단계에서 드랍아웃을 사용하면 결과가 랜덤해진다.

- 당연히, 웨이트 및 바이어스의 초기화가 랜덤할 경우 결과가 랜덤해진다.

- 트레인셋의 셔플, 드랍아웃, 웨이트 초기화의 랜덤성분을 제거할 경우 결과값이 항상 일정하다. 

 

gpu 기준

Reproducible Results

결과의 재현을 위해 찾은 해법은 https://pypi.org/project/tensorflow-determinism/

 

위에 코드를 추가해주고 나니 새로운 실험에서 동일한 결과를 얻을 수 있었다.

반응형

댓글