Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

このページについて

  • 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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away