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

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

関連記事

tensorflowのmatmulの使い方について(次元別の仕様やnumpy.matmulとの違いを整理)

  <目次> (1) tensorflowのmatmulの使い方について(次元別の仕様やnumpy.matmulとの違いを整理)  (1-1) tensorflow.matmulの次元別の挙 …

ディープラーニング入門でニューラルネットワークを用いてAND回路を学習させるプログラムをJavaで作成

ニューラルネットワークでAND回路を学習させるJavaプログラムを作成したので、その解説を行います。 (0)目次&概説 (1) ニューラルネットワークの概要  (1-1) ニューラルネットワークとは? …

no image

ディープラーニングのパーセプトロンとは?Pythonで実装したサンプルもご紹介

  <目次> (1) ディープラーニングのパーセプトロンとは?Pythonで実装したサンプルもご紹介  (1-1) パーセプトロンとは?  (1-2) 処理の流れ  (1-3) サンプルプロ …

ディープラーニングのロジスティクス回帰をPythonで実装した例をご紹介

  <目次> (1) ディープラーニングのロジスティック回帰をPythonで実装した例をご紹介  (1-1) 実装のフロー  (1-2) 実装例 (1) ディープラーニングのロジスティック回 …

no image

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

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

  • English (United States)
  • 日本語
Top