本日は、TensorFlow2.0以降の環境で「AttributeError: module ‘tensorflow’ has no attribute ‘app’」が発生してしまった時の対処方法を紹介します。
私が上記の現象にあったのは、TensorFlow2.0以降の環境でプログラムを実施していた時でした。
そしてその際に下記のエラーも出力されたので、今回はそのエラーも追加で対応していきます。
「AttributeError: module ‘tensorflow’ has no attribute ‘GraphDef’」
「AttributeError: module ‘tensorflow’ has no attribute ‘Session’」
筆者が上記の現象にあった時の内容はInceptionで画像分類をするプログラムでした。
下記がベースのあるGitHubです。
https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py
TensorFlow2.0以前であれば「classify_image.py」を利用してもエラーが出力されません。
上記のエラーの原因は全てTnesorFlow2.0以降で削除されたものを利用しているからです。
そのため今回は比較的に簡単に出来る対処法を紹介します。
将来的には今回の対応とは別に今後TensorFlow2.0以降でずっと動くようにプログラムを改良するのが一番かと思います。
今回対応したファイルはGithubに上げておりますのでダウンロード等して参考にしてください。
https://github.com/Yoshiyuki-Su/TensorFlow_Sample_Programs/blob/master/ImageNet/classify_image.py
実施環境は下記になります。
OS | Windows10 home 64bit |
Python | 3.7.7 |
tensorflow | 2.1.0 |
「AttributeError: module ‘tensorflow’ has no attribute ‘app’」の対処法
「AttributeError: module ‘tensorflow’ has no attribute ‘app’」が表示される原因は上記でも記載した通り、TensorFlow2.0以降でtf.appが廃止されているため、上記のエラーが表示されてしまっています。
解決方法(tf.app.flags)
私は今回TensorFlow2.0以降にも対応出来る方法ではなく、一時的に(現在:2020/08/21)プログラムを動くようにする方法です。
将来的にはこの修正方法も廃止にもなるかもしれません。
その際は、TensorFlow2.0以降用にプログラムを改良する必要が出てきます。
下記の例では「classify_image.py」の改良例になります。
FLAGS = tf.app.flags.FLAGS
↓ tf.appをtf.compat.v1に変換します。
FLAGS = tf.compat.v1.flags.FLAGS
※変更箇所はベース(https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py)の48行目を対象としています。
「classify_image.py」を変更している人は、他に56行目、61行目、63行目のtf.appを変更する必要があります。
解決方法(tf.app.run())
また、「classify_image.py」を変更している人は、上記の箇所以外にもう一箇所変更する必要があります。
変更箇所はベース(https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py)の214行目を対象になります。
tf.app.run()
↓ tf.app.run()をtf.compat.v1.app.run()に変換します。
tf.compat.v1.app.run()
「AttributeError: module ‘tensorflow’ has no attribute ‘GraphDef’」の対処法
「AttributeError: module ‘tensorflow’ has no attribute ‘GraphDef’」が表示される原因は上記でも記載した通り、TensorFlow2.0以降でtf.GraphDef()が廃止されているため、上記のエラーが表示されてしまっています。
解決方法(tf.GraphDef())
私は今回TensorFlow2.0以降にも対応出来る方法ではなく、一時的に(現在:2020/08/21)プログラムを動くようにする方法です。
将来的にはこの修正方法も廃止にもなるかもしれません。
その際は、TensorFlow2.0以降用にプログラムを改良する必要が出てきます。
下記の例ではclassify_image.pyの改良例になります。
graph_def = tf.GraphDef()
↓ tf.GraphDef()をtf.compat.v1.GraphDef()に変換します。
graph_def = tf.compat.v1.GraphDef()
※変更箇所はベース(https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py)の141行目を対象としています。
「AttributeError: module ‘tensorflow’ has no attribute ‘Session’」の対処法
「AttributeError: module ‘tensorflow’ has no attribute ‘Session’」が表示される原因は上記でも記載した通り、TensorFlow2.0以降でtf.Session()が廃止されているため、上記のエラーが表示されてしまっています。
解決方法(tf.Session())
私は今回TensorFlow2.0以降にも対応出来る方法ではなく、一時的に(現在:2020/08/21)プログラムを動くようにする方法です。
将来的にはこの修正方法も廃止にもなるかもしれません。
その際は、TensorFlow2.0以降用にプログラムを改良する必要が出てきます。
下記の例ではclassify_image.pyの改良例になります。
tf.Session() as sess:
↓ tf.Session()をtf.compat.v1.Session()に変換します。
tf.compat.v1.Session() as sess:
※変更箇所はベース(https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py)の162行目を対象としています。
まとめ
今回はTensorFlow2.0以降で廃止されたモジュール等をTensorFlowで引き続き使いたい時の解決方法を記載しました。
今回の解決方法は一時的なのになると思うので、将来を見越してTensorFlow2.0以降に対応できるプログラムの修正方法の方が良いと思います。
私も修正が完了したら記事にして行きたいと思います。
再度、今回の修正したファイルやベースファイルがあるGithubのURLを張っておくので参考にしてみてください。
ベース
https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py
今回の対応した結果のプログラム
https://github.com/Yoshiyuki-Su/TensorFlow_Sample_Programs/blob/master/ImageNet/classify_image.py