복붙노트

[PYTHON] 케라에서 재현 가능한 결과를 얻는 방법

PYTHON

케라에서 재현 가능한 결과를 얻는 방법

Keras 프레임 워크 (https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)에서 imdb_lstm.py 예제를 실행할 때마다 다른 결과 (테스트 정확도)를 얻습니다. 코드에는 keras 임포팅 전에 np.random.seed (1337)가 맨 위에 있습니다. 그것은 모든 실행에 대해 다른 숫자를 생성하지 못하게해야합니다. 내가 뭘 놓치고 있니?

업데이트 : repro하는 방법 :

업데이트 2 : MinGW / msys, 모듈 버전이있는 Windows 8.1에서 실행하고 있습니다. 테 노노 0.7.0 ~ 1.8.1 scipy 0.14.0c1

UPDATE3 : 문제를 조금 좁혔습니다. GPU (setano 플래그 장치 = gpu0으로 설정)로 예제를 실행하면 매번 다른 테스트 정확도가 나오지만 CPU에서 실행하면 모든 것이 예상대로 작동합니다. 내 그래픽 카드 : NVIDIA GeForce GT 635)

해결법

  1. ==============================

    1.Theano의 문서에서는 무작위 변수를 파싱하는 어려움과 각 그래프 인스턴스에 고유 한 난수 생성기를 사용하는 이유에 대해 설명합니다.

    Theano의 문서에서는 무작위 변수를 파싱하는 어려움과 각 그래프 인스턴스에 고유 한 난수 생성기를 사용하는 이유에 대해 설명합니다.

    또한 모든 난수 생성기를 시드하는 방법에 대한 예제도 제공합니다.

    >>> srng.seed(902340)  # seeds rv_u and rv_n with different seeds each
    
  2. ==============================

    2.마침내 코드로 재현 가능한 결과를 얻었습니다. 웹에서 본 답변의 조합입니다. 가장 먼저 @alex가 말한 것을 수행합니다.

    마침내 코드로 재현 가능한 결과를 얻었습니다. 웹에서 본 답변의 조합입니다. 가장 먼저 @alex가 말한 것을 수행합니다.

    다음과 같이 추가로 THEANO_FLAGS를 사용하여 Keras 코드를 호출하여 cuDNN과 관련하여 @ user2805751이 지적한 문제를 해결해야합니다.

    마지막으로,이 주석에 따라 Theano 설치를 패치해야합니다. 기본적으로 다음과 같이 구성되어 있습니다.

    동일한 시드에 대해 동일한 결과를 가져와야합니다.

    속도가 느려질 수도 있습니다. 나는 약 10 %의 가동 시간 증가를 보았다.

  3. ==============================

    3.Keras 문서 (https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development)에서 해당 답변을 찾을 수 있습니다.

    Keras 문서 (https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development)에서 해당 답변을 찾을 수 있습니다.

    요약하면, 한 컴퓨터 / 노트북의 CPU에서 파이썬 스크립트로 재현 가능한 결과를 얻으려면 반드시 다음을 수행해야합니다.

    상단의 Keras 링크 다음에 사용하는 소스 코드는 다음과 같습니다.

    # Seed value
    # Apparently you may use different seed values at each stage
    seed_value= 0
    
    # 1. Set `PYTHONHASHSEED` environment variable at a fixed value
    import os
    os.environ['PYTHONHASHSEED']=str(seed_value)
    
    # 2. Set `python` built-in pseudo-random generator at a fixed value
    import random
    random.seed(seed_value)
    
    # 3. Set `numpy` pseudo-random generator at a fixed value
    import numpy as np
    np.random.seed(seed_value)
    
    # 4. Set `tensorflow` pseudo-random generator at a fixed value
    import tensorflow as tf
    tf.set_random_seed(seed_value)
    
    # 5. Configure a new global `tensorflow` session
    from keras import backend as K
    session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
    sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
    K.set_session(sess)
    

    파이썬 스크립트에서 사용하는 numpy, scikit-learn 또는 tensorflow / keras 함수에서 seed 또는 random_state를 지정할 필요가 없다는 것은 말할 필요도 없습니다. 위의 소스 코드를 사용하여 전역 적으로 의사 - 랜덤 제너레이터를 고정 된 값으로 사용합니다.

  4. ==============================

    4.이전 답변에 뭔가를 추가하고 싶습니다. 파이썬 3을 사용하고 모든 실행에 대해 재현 가능한 결과를 얻으려면 다음을 수행해야합니다.

    이전 답변에 뭔가를 추가하고 싶습니다. 파이썬 3을 사용하고 모든 실행에 대해 재현 가능한 결과를 얻으려면 다음을 수행해야합니다.

  5. ==============================

    5.이전 의견에 동의하지만 재현 가능한 결과에는 때로는 동일한 환경 (예 : 설치된 패키지, 기계 특성 등)이 필요합니다. 따라서 재현 가능한 결과를 얻으려면 환경을 다른 곳으로 복사하는 것이 좋습니다. 다음 기술 중 하나를 사용해보십시오.

    이전 의견에 동의하지만 재현 가능한 결과에는 때로는 동일한 환경 (예 : 설치된 패키지, 기계 특성 등)이 필요합니다. 따라서 재현 가능한 결과를 얻으려면 환경을 다른 곳으로 복사하는 것이 좋습니다. 다음 기술 중 하나를 사용해보십시오.

  6. ==============================

    6.Keras를 사용하는 신경망의 Sequential () 종류를 훈련하고 테스트했습니다. 나는 시끄러운 음성 데이터에서 비선형 회귀를 수행했다. 무작위 시드를 생성하기 위해 다음 코드를 사용했습니다.

    Keras를 사용하는 신경망의 Sequential () 종류를 훈련하고 테스트했습니다. 나는 시끄러운 음성 데이터에서 비선형 회귀를 수행했다. 무작위 시드를 생성하기 위해 다음 코드를 사용했습니다.

    import numpy as np
    seed = 7
    np.random.seed(seed)
    

    나는 같은 데이터에 대해 훈련하고 테스트 할 때마다 val_loss와 똑같은 결과를 얻는다.

  7. from https://stackoverflow.com/questions/32419510/how-to-get-reproducible-results-in-keras by cc-by-sa and MIT license