Keras의 backend가 생각대로 되지 않을 때의 메모

이 페이지 정보


  • Anaconda 환경에서 Keras를 움직일 때,
  • keras.json에서 tensorflow 백엔드를 설정했지만
  • theano가 시작될 때 어떻게 했습니까? 의 메모입니다.

  • 작업 메모 레벨이므로, 거친 내용입니다.

  • (추기) 같은 사건의 기사가 있었으므로 링크 하겠습니다. 중복 스미마센.

  • 이런 상황입니다


  • keras.json은 tensorflow를 지정하지만
  • (tensorflow_p36)[ec2-user@hostname ~]$ cat .keras/keras.json
    {
        "backend": "tensorflow"
    }
    
  • 시작된 백엔드는



  • 대응 방법


  • 결론을 내면 anaconda는 keras.json 설정이 효과가 없으므로 환경 변수에서 KERAS_BACKEND를 지정하면 tensorflow 백엔드를 사용할 수 있습니다.
    export KERAS_BACKEND=tensorflow
    

    발생 원인과 확인한 과정


  • 다음은 원인 부분과 그 특정 과정입니다.
  • 세세한 것이 알고 싶은 사람은 읽어 주시면과. .

  • 우선, jupyter와 자식 프로세스를 확인


  • 자신의 경우, Anaconda 환경의 jupyter notebook를 사용하고 있었으므로, 우선은 jupyter의 프로세스를 의심했습니다.
  • ps 해 보면 이런 느낌으로, ★가 jupyter로부터 기동한 python의 아이 프로세스.
  • (tensorflow_p36)[ec2-user@hostname ~]$ ps -ef |grep python
      ec2-user  5978  5954  2 06:56 pts/0    00:00:01 /home/ec2-user/anaconda3/bin/python /home/ec2-user/anaconda3/bin/jupyter-notebook
    ★ ec2-user  6000  5978  1 06:56 ?        00:00:00 /home/ec2-user/anaconda3/envs/tensorflow_p36/bin/python -m ipykernel -f /home/ec2-user/.local/share/jupyter/~中略~.json
      ec2-user  6054  6018  0 06:57 pts/1    00:00:00 grep --color=auto python
    [ec2-user@hostname ~]$
    

    해당 프로세스의 환경 변수 확인(범인 발견)


  • 이 아이 프로세스★가 왜, theano 백엔드를 이용해 버리는가?
  • 환경 변수를/proc 이하로 확인하면 범인 발견! 왜 KERAS_BACKEND = theano가 정의되었습니다. . .
  • (tensorflow_p36)[ec2-user@hostname ~]$ vi /proc/6000/environ
    ~~~(色々な環境変数)~  KERAS_BACKEND=theano   ~~~~
    

    어디에서 KERAS_BACKEND가 정의 되었습니까?


  • jupyter가 아니고, 원시로 Anaconda 가상 환경을 만져도, backend가 theano가 되어 있다. .
  • (tensorflow_p36) [ec2-user@hostname ~]$ python
    Python 3.6.3 |Anaconda, Inc.| (default, Nov 20 2017, 20:41:42)
    [GCC 7.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import keras
    Using Theano backend. ★ここ★
    >>>
    
  • Anaconda 환경이 이상하기 때문에 activate 명령을 bash -x로 디버깅
  • 무려, keras_activate.sh가 환경 변수로 theano를 백엔드로 이용하도록 지정하고 있었다. .
  • 왜다. .

  • (tensorflow_p36) [ec2-user@hostname ~]$ bash -x activate tensorflow_p36
    + _CONDA_ROOT=/home/ec2-user/anaconda3
    + _conda_script_is_sourced
    
    ~~(中略)~~
    
    ++ . /home/ec2-user/anaconda3/envs/tensorflow_p36/etc/conda/activate.d/keras_activate.sh  ★犯人★
    ++++ uname
    +++ '[' Linux == Darwin ']'
    ++++ uname
    +++ '[' Linux == Linux ']'
    +++ export KERAS_BACKEND=theano   ★環境変数★
    +++ KERAS_BACKEND=theano
    + _conda_hashr
    + case "$_CONDA_SHELL_FLAVOR" in
    + hash -r
    

    그럼, keras_activate.sh의 내용은?


  • 뭐야, 이 분기. . .
  • 리눅스라면 자동적으로 theano라고! !
  • #!/bin/bash
    if [ "$(uname)" == "Darwin" ]
    then
        # for Mac OSX
        export KERAS_BACKEND=tensorflow
    elif [ "$(uname)" == "Linux" ]
    then
        # for Linux
        export KERAS_BACKEND=theano
    fi
    

    결국 activate 명령은 theano를 지정했습니다. .


  • 회피하기 위해서는, 환경 변수(.bashrc)당에 이하를 지정해 두면 OK.
  • activate 명령을 두드리면 theano로 덮어쓰기 때문에 아래를 activate 후에 실행.
  • export KERAS_BACKEND=tensorflow
    

    좋은 웹페이지 즐겨찾기