Windows10&VsCode&tensorflow2.0の開発環境でtensorflow.kerasの記述が「unresolved import 'tensorflow.keras'」と警告される件について調べたことを、取り急ぎ書いておきます。
困ったこと
tensorflowr2.0にしたら。
from tensorflow.keras import datasets, layers, models
のようにインポートすると、こんな感じで「unresolved import 'tensorflow.keras'」と表示するようになりました。
だからといって、実行できないわけではありません。
この状態でも実行するとエラーなくいけます。
実行できるのだから、気にしなければよいだけなんですけど、気になります(笑)
原因は何だろうか?
tensorflow r1.xxの時はこういう現象はありませんでした。
何か情報がないか?を調べていると、こんなスレッドがありました。
IDE cannot resolve module tf.keras・・って、ピンポイントです。
こちらを見ていると、参考になりそうな記述がありました。
ここでの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」のセッションのスピーカーに名前が載っている人だと思います。
なので、後者のコメントの信ぴょう性は高いかな・・と。
まとめると。
tensorflowパッケージの__init__.pyに、kerasは動的にインポートされる。
だから、IDEでは識別できなくて「unresolved import」になるけど、実行できる。
ということらしいです。
なんとなく、納得できる理由だとは思います。
当面の回避策について
話題にはなっているみたいなので、そのうち修正されると期待したいとは思います。
実行はできますしね。
でも、個人的には気持ち悪いので、いちおう「当面の回避策」だけ確認しときます。
やりくちとしては単純で、こうなっているところ。
tensorflow.keras の部分を以下のように書き換えるだけです。
tensorflow_core.python.keras
そうすると以下のように「unresolved import」は消えます。
実行も問題なくできます。
ただ。
あくまで一時しのぎです。
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
とりあえず、自分の環境ではこれでいけました。
今回はこんなところで。
ではでは。