Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

機械学習 (Machine Learning)

TensorFlowで「AttributeError: module ‘tensorflow’ has no attribute ‘xxxxxx’」が出た時の原因と対策について

投稿日:2022年9月18日 更新日:

 

<目次>

(1) TensorFlowで「AttributeError: module ‘tensorflow’ has no attribute ‘xxxxxx’」が出た時の原因と対策について

(1-1) 事象

Pythonで「tensorflow」モジュールを使ったプログラムを実行した所、下記のエラーが発生しました。
 
(エラーメッセージ)
Traceback (most recent call last):
  File "c:\dev\Python\00_LocalPythonApp\Deeplearning\python_no_attribute_error.py", line 12, in 
    main()
  File "c:\dev\Python\00_LocalPythonApp\Deeplearning\python_no_attribute_error.py", line 8, in main
    x = tf.placeholder(tf.float32, shape=[None,2])
AttributeError: module 'tensorflow' has no attribute 'placeholder'

(エラー発生したプログラム)
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 
import tensorflow as tf

def main():
    
    x = tf.placeholder(tf.float32, shape=[None,2])
    t = tf.placeholder(tf.float32, shape=[None,1])
        
if __name__ == "__main__":
    main()
(図111)

(1-2) 原因

TensorFlow 2.0にアップグレードしているにも関わらず、バージョン1.XのAPIを使用している場合に発生するようです。
 
ご自身のTensorflowのバージョン確認するには、次のプログラムを実行して確認します。
import tensorflow as tf
print(tf.__version__)
(図121)

(1-3) 対策(応急処置)

下記のような記述を追加することで、2.0以上の環境でも1.XのAPIを使う事ができます。

import tensorflow.compat.v1 as tf1
tf1.disable_v2_behavior()
(修正後プログラム)
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 
import tensorflow.compat.v1 as tf1
tf1.disable_v2_behavior()

def main():
    
    x = tf1.placeholder(tf1.float32, shape=[None,2])
    t = tf1.placeholder(tf1.float32, shape=[None,1])
        
if __name__ == "__main__":
    main()
(修正後メッセージ)
WARNING:tensorflow:From C:\Users\XXXXX\.pyenv\pyenv-win\versions\3.9.6\lib\site-packages\tensorflow\python\compat\v2_compat.py:107: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.
Instructions for updating:
non-resource variables are not supported in the long term
(図131)
一旦はピンポイントのエラーは解消しましたが、本質的な対策ではないので、後述の「対策(恒久)」の実施をオススメします。。

(1-4) 対策(恒久)

メッセージに書かれている通り、v1.Xは非推奨であり将来は廃止になる予定がある(is deprecated and will be removed in a future version.)ため、上記の対応は応急処置にしかなりません。
恒久的にはv2の記述に統一していくのが最善となるので、今回は「tf_upgrade_v2.exe」という、レガシーコードをv2仕様に移行するための支援をしてくれるプログラムを流してみます。

●①「tf_upgrade_v2.exe」の確認

私の場合は以下の場所に格納されていました。TensorFlow 1.13以降は自動でインストールされている様です。

(格納場所の例)

C:\Users\XXXXXXXXXXXXX\.pyenv\pyenv-win\versions\3.9.6\Scripts\tf_upgrade_v2.exe
(図141)

●②変換の実行

今回は試しに単一のプログラムを変換してみます。「–infile」には変換対象のファイルを指定し、「–outfile」には変換結果のファイルを新規作成する際のパスやファイル名を指定します。
(コマンド例)
& "C:\Users\XXXX\.pyenv\pyenv-win\versions\3.9.6\Scripts\tf_upgrade_v2.exe" --infile ./python_no_attribute_error.py --outfile ./python_no_attribute_error_v2.py
(図142①)Before
コマンド実行
(図142②)After
 

●③変換結果の確認

変換後の結果を確認すると、次のようにv1.X用の関数などがv2.0以降では「compat.v1.xxxx」のような互換性モジュールに置換されている事が確認できます。
⇒≒TensorFlow 2.0 で利用できるシンボルのみを使用する形式にコードがアップグレードされた
x = tf.placeholder(tf.float32, shape=[None,2])
x = tf.compat.v1.placeholder(tf.float32, shape=[None,2])
 
(図142③)

●④新APIへの移行(手作業)

互換性モジュール(compat.v1.xxxx)で置き換わった部分は、最終的にはtf.compat.v1 名前空間ではなく tf.* 名前空間の新しい API に早急に移行する必要があります。
 
こちらは、v1の「placeholder」をv2仕様に置き換えた例です。手間は掛かるものの、最終的にはサポートされなくなるv1の互換モジュールも置き換えていく必要があります。
 
⇒(例)v1のplaceholderをv2仕様にリファクタリングした例
(参考)

Adsense審査用広告コード


Adsense審査用広告コード


-機械学習 (Machine Learning)

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

numpy.dotの使い方について(次元別の仕様を整理)

  <目次> (1) numpy.dotの使い方について(次元別の仕様を整理)  (1-1) numpy.dotの次元別の挙動  (1-2) numpy.dotの次元別の挙動(詳細)  (1 …

no image

最尤推定とは?考え方を実世界の例も交えシンプルにご紹介

  <目次> (1) 最尤推定とは?考え方を実世界の例も交えシンプルにご紹介  (1-1) 最尤推定とは?  (1-2) 最尤推定の考え方  (1-3) 最尤推定の実際の計算方法は? (1) …

no image

Tensorflowで「Could not load dynamic library ‘cudart64_110.dll’」が出る原因と対処

  <目次> (1) Tensorflowで「Could not load dynamic library ‘cudart64_110.dll’」が出る原因と対処   …

確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介

  <目次> (1) 確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介  (1-1) (課題)「勾配降下法」が抱える課題  (1-2) (対策)確率的勾 …

ロジスティック回帰をエクセルで計算する方法(ディープラーニング)

<目次> (1) ロジスティック回帰をエクセルで計算する方法(ディープラーニング)  (1-1) 【前提①】ロジスティック回帰とは?  (1-2) 【前提②】解決したい課題  (1-3) ロジスティッ …

  • English (United States)
  • 日本語
Top