前提・実現したいこと
ここに質問の内容を詳しく書いてください。
tensorflowを用いてAttentionを実行しようとしています。
tensorflow1からtensorflow2に書き換えを行っている途中でエラーが出ました。
tensorflowについては初心者です。
発生している問題・エラーメッセージ
from tensorflow.keras.layers.Attention import Recurrent ModuleNotFoundError: No module named 'tensorflow.keras.layers.Attention'
該当のソースコード
ソースコード
試したこと
自分なりに調べて解決しようとしたのですが、できませんでした。また、compat.v1を用いて実行しようとしたところ同じエラーが発生してしまいました。attentionの使用方法自体が間違っている可能性もあると考えています。
補足情報(FW/ツールのバージョンなど)
python 3.6.12
tensorflow 2.5.0
from tensorflow import keras
は、できますでしょうか?
返信ありがとうございます。今やってみたところ何も変化はありませんでした。
from tensorflow import keras
でエラーにならないなら、下記はどうでしょうか?
from tensorflow.keras import layers
from tensorflow.keras.layers import Attention
返信が遅れて申し訳ないです。
import Attention でエラーが発生してしまいます。
下記がエラーコードです。
import Attention
ModuleNotFoundError: No module named 'Attention'
from tensorflow.keras.layers import Attention
は1行です
「from...Attention」を、途中で改行しないで1行に入力してください
(うっかり改行して書いていたので、直しました)
あと、
from tensorflow.python.keras.layers.dense_attention import Attention
は、どうでしょうか?
こちらも1行なので、途中で改行しないでください
両者を実行した場合、エラーコードが下記になりました。
from tensorflow.keras.layers.Attention import Recurrent
ModuleNotFoundError: No module named 'tensorflow.keras.layers.Attention'
あと、importした際にすべてコメントアウトしたような表記になるのですが、大丈夫でしょうか?
私が書いたコードのみ、一つずつ実行して、それぞれの結果を教えてください
> ModuleNotFoundError: No module named 'tensorflow.keras.layers.Attention'
は、
> from tensorflow.keras.layers import Attention
を実行した際のエラーですか?
> from tensorflow.python.keras.layers.dense_attention import Attention
を実行した際は、どうなりますか?
エラーが出るとしても、たぶんエラーの表示内容は変わると思いますので、お手数ですがそれをそのまま書いてください
確認ですが、
> tensorflow1からtensorflow2に書き換えを行っている途中でエラーが出ました。
とは、TF 1.* では正常に動いたコードが TF 2.* ではエラーが出る、という意味ですよね?
> from tensorflow.keras.layers.Attention import Recurrent
を、当方の tensorflow 1.15.3 が入ってるPythonで実行したところ、「No module named 'tensorflow.keras.layers.Attention'」というエラーが出るのですが、質問者さんの環境では、このコードを TF 1.* で実行できたのですか?
> エラーが出るとしても、たぶんエラーの表示内容は変わると思いますので、お手数ですがそれをそのまま書いてください
お手数をおかけします。
それぞれのコードのみを実行した場合ですとエラーは出ないのですが、既存のコードに組み込んで実行した際のエラーは、
from tensorflow.keras.layers.Attention import Recurrent
ModuleNotFoundError: No module named 'tensorflow.keras.layers.Attention'
で同じものが出てきます。
> コードをどのようにして実行してますか?
メインのguiを実行するコードがあり、その他付属の機能が複数に分かれています。このコードはattentionの機能を実装するためのコードとなっています。IDEはPyCharmです。
上にも書きましたけど、当方の環境では、tensorflow 1.15.3 でも
「from tensorflow.keras.layers.Attention import Recurrent」
はエラーになります
そちらの環境で、TF 1.* で動いていた「既存のコード」での実際の記述は、
「from tensorflow.keras.layers.Attention import Recurrent」
ですか?
「from keras.layers import recurrent」
とかではないですか?
>TF 1.* では正常に動いたコードが TF 2.* ではエラーが出る、という意味ですよね?
他者からの引継ぎでバージョンを変更しようとしているため、自分でこのコードをTF1.*で動かしていたわけではないですが、TF1.*での動作は確認しています。
> 「from keras.layers import recurrent」
とかではないですか?
はい、「from tensorflow.keras.layers.Attention import Recurrent」で間違いないです。
> 他者からの引継ぎでバージョンを変更しようとしている
その「他者」が、TF 2.* に移植しようとして書き換えていた、という可能性はありませんか?
先ほど当方で確認したのはMacでしたが、WindowsのPythonでも確認しました
やはり、「from tensorflow.keras.layers.Attention import Recurrent」は「No module named 'tensorflow.keras.layers.Attention'」というエラーになりました
試したTFのバージョンは、こちらもMacと同じバージョンの tensorflow 1.15.3 です
もっと古いバージョンならばエラーにならなかったのかもしれませんが、TF 1.* の最終バージョンである TF 1.15 では、TF 2.* と同じエラーになります
> TF1.*での動作は確認しています。
そのときのバージョンは分かりませんか?
すみません。ただいまもう一度確認したところ、
「from tensorflow.keras.layers.Attention import Recurrent」ではなく
「from keras.layers.recurrent import Recurrent」でした。申し訳ないです。
>「他者」が、TF 2.* に移植しようとして書き換えていた、という可能性はありませんか?
その可能性はないと思います。
> そのときのバージョンは分かりませんか?
その時のバージョンは分かりません。すみません。
Keras 2.3.1では、
https://github.com/keras-team/keras/blob/2.3.1/keras/layers/recurrent.py
の23行目の「from ..legacy.layers import Recurrent」があるので、「from keras.layers.recurrent import Recurrent」ができますけど、
https://github.com/keras-team/keras/blob/2.3.1/keras/legacy/layers.py
の314行目に「Do not use in a model -- it's not a valid layer!」と書いてあります
Keras 2.4.0以降では、「from ..legacy.layers import Recurrent」が無くなってます
「legacy」ですから、切り捨てられちゃったのでしょうね
https://github.com/keras-team/keras/blob/2.4.0/keras/layers/recurrent.py
https://github.com/keras-team/keras/blob/v2.6.0/keras/layers/recurrent.py
> TF1.*での動作は確認しています。
のときは、Kerasが2.3.1かそれよりも古いバージョンを使っていたので、「from keras.layers.recurrent import Recurrent」ができた
Keras 2.4.0以降では、それは削除されてできなくなった
tensorflow.kerasには、もともとそれは入ってないのでできない
https://github.com/tensorflow/tensorflow/blob/v1.9.0/tensorflow/python/keras/layers/recurrent.py
ということのようですね
なるほど、ありがとうございます。
「from keras.layers.recurrent import Recurrent」の代わりになるものを探すという手段がベストな判断ですかね?
個人的には「from tensorflow.keras.layers import Attention」をどうにか使用できないかなとは思っているのですが、、、
> 「from keras.layers.recurrent import Recurrent」の代わりになるものを探すという手段がベストな判断ですかね?
TF 1.* 用コードの
「from keras.layers.recurrent import Recurrent」
以降の「Recurrent」を使っているところを、現状で利用可能なもので置き換える、ということになりますね
分かりました。色々とありがとうございました!
回答1件
あなたの回答
tips
プレビュー