LoginSignup
6
6

More than 1 year has passed since last update.

Kerasのbackendが、思い通りならない時のメモ

Last updated at Posted at 2018-02-07

このページについて

  • Anaconda環境でKerasを動かした時に、
    • keras.jsonで、tensorflowバックエンドを設定したはずなのに、、、
    • theanoが起動してしまう時にどうしたか? のメモです。
  • 作業メモレベルですので、粗末な内容です。
  • (追記) 同じ事象の記事があったのでリンクさせて頂きます。重複しスミマセン。

こんな状況です

  • keras.jsonはtensorflowを指定しているのに、、
(tensorflow_p36)[ec2-user@hostname ~]$ cat .keras/keras.json
{
    "backend": "tensorflow"
}
  • 起動したバックエンドは、、

image.png

対応方法

  • 結論から書くと、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
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6