このページについて
- 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