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の中身は?

  • なんだ、この分岐。。。
  • Linuxだったら自動的に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