SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

windows10&VsCode&tensorflow r2.0でtensorflow.kerasがunresolved import 'tensorflow.keras'になる。

Windows10&VsCode&tensorflow2.0の開発環境でtensorflow.kerasの記述が「unresolved import 'tensorflow.keras'」と警告される件について調べたことを、取り急ぎ書いておきます。

f:id:arakan_no_boku:20191221000914p:plain

 

困ったこと

 

tensorflowr2.0にしたら。

from tensorflow.keras import datasets, layers, models

のようにインポートすると、こんな感じで「unresolved import 'tensorflow.keras'」と表示するようになりました。

f:id:arakan_no_boku:20200106224305p:plain

だからといって、実行できないわけではありません。

この状態でも実行するとエラーなくいけます。

実行できるのだから、気にしなければよいだけなんですけど、気になります(笑)

 

原因は何だろうか?

 

tensorflow r1.xxの時はこういう現象はありませんでした。

何か情報がないか?を調べていると、こんなスレッドがありました。

github.com

IDE cannot resolve module tf.keras・・って、ピンポイントです。

www.jetbrains.com

こちらを見ていると、参考になりそうな記述がありました。

ここでのIDEは「pyCharm」なので、VsCodeに読み替える必要はありますが。

引用すると。

まず、こんなコメントがあります。

Yes, this is not a bug from pyCharm but tensorflow itself.
The bug is caused by missing tensorflow.python import keras in __init__.py of tensorflow package.

これはpyCharmではなく、テンソルフローのバグです。
このバグは、tensorflowパッケージの__init__.pyにtensorflow.python import kerasが欠落していることが原因です。

こちらの発言者はGoogleの関係者というわけでもなさそうなので、そのままストレートに信じる根拠はありませんが、それについてのやりとりに、Anna Revinskaya さんが以下のようなコメントをつけてます。

keras is imported dynamically in the __init__.py file.
I am not familiar with the way pyCharm looks for autocomplete symbols, but I will see if there is any workaround (may be adding 'keras' to __all__). 

kerasは__init__.pyファイルに動的にインポートされます。
pyCharmがオートコンプリートシンボルを検索する方法についてはよく知りませんが、回避策があるかどうかを確認します(「keras」を__all__に追加している可能性があります)。

 とあります。

この「Anna Revinskaya」さんは、以下のTensorFlow Dev Summit の「2.0 and Porting Models」のセッションのスピーカーに名前が載っている人だと思います。

www.tensorflow.org

なので、後者のコメントの信ぴょう性は高いかな・・と。

まとめると。

tensorflowパッケージの__init__.pyに、kerasは動的にインポートされる。
だから、IDEでは識別できなくて「unresolved import」になるけど、実行できる。

ということらしいです。

なんとなく、納得できる理由だとは思います。

 

当面の回避策について

 

話題にはなっているみたいなので、そのうち修正されると期待したいとは思います。

実行はできますしね。

でも、個人的には気持ち悪いので、いちおう「当面の回避策」だけ確認しときます。

やりくちとしては単純で、こうなっているところ。

f:id:arakan_no_boku:20200107000809p:plain

tensorflow.keras の部分を以下のように書き換えるだけです。

tensorflow_core.python.keras

そうすると以下のように「unresolved import」は消えます。

実行も問題なくできます。

f:id:arakan_no_boku:20200107001019p:plain

ただ。

あくまで一時しのぎです。

tensorflowかVsCode側で対応されるのを待ちましょうかね。

 

おまけ

 

実は、sklearn.model_selection も同じようになっていました。

unresolved import 'sklearn.model_selection'

 こういうimportを書いたときです。

from sklearn.model_selection import train_test_split

以前は「from sklearn.cross_validation import train_test_split」のようにしていたのですが、最近のバージョン(0.18?)で変わったみたいです。

だから、こちらの「unresolved」は文字通りなので、skkearnのバージョンを上げます。

pip install -U scikit-learn

とりあえず、自分の環境ではこれでいけました。

今回はこんなところで。

ではでは。