1. ホーム
  2. テンソルフロー

tensorflow 2.0, ニューラルネットワークス: Sinusoidal Fitting, AttributeError: モジュール 'tensorflow' has no attribute 'placeholder' エラー

2022-02-10 09:15:51

tensorflowの新規導入、anacondaのインストール、pythonの実行環境のセットアップ、前回のガイドに従って、最初のニューラルネットワークのトレーニング:正弦波フィッティングを入力しました。

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

def gen_data():
    x = np.linspace(-np.pi,np.pi,100)
    x = np.reshape(x,(len(x),1)) # retransform x to a (100,1) two-dimensional array
    y = np.sin(x)
    return x,y

INPUT_NODE=1
HIDDEN_NODE=50
OUTPUT_NODE=1
LEARNING_RATE=0.001

def inference(input_tensor):
    with tf.name_scope('Layer-1'):
        weight = tf.Variable(tf.truncated_normal(shape=[INPUT_NODE,HIDDEN_NODE],stddev=0.1,dtype=tf.float32),name='weight')
        # Create the first layer of weight variables, (1,50)
        bias = tf.Variable(tf.constant(0,dtype=tf.float32,shape=[HIDDEN_NODE]))
        # Set the bias value
        l1 = tf.nn.relu(tf.nn.xw_plus_b(input_tensor,weight,bias))
        # tf.nn.xw_plus_b(x,w,bias) = x * w + bias
    with tf.name_scope('Layer-2'):
        weight = tf.Variable(tf.truncated_normal(shape=[HIDDEN_NODE,OUTPUT_NODE],stddev=0.1,dtype=tf.float32),name='weight')
        bias = tf.Variable(tf.constant(0,dtype=tf.float32,shape=[OUTPUT_NODE]))
        l2 = tf.nn.xw_plus_b(l1,weight,bias)
    return l2

def train():
    x = tf.placeholder(dtype=tf.float32,shape=[None,INPUT_NODE],name='x-input')
    y_ = tf.placeholder(dtype=tf.float32,shape=[None,OUTPUT_NODE],name='y-input')
    global_step = tf.Variable(0,trainable=False)
    logits = inference(x)
    loss = tf.reduce_mean(tf.square(y_-logits)) # mean squared deviation
    train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss,global_step=global_step)
    train_x,train_y = gen_data()
    np.random.seed(200)
    shuffle_index = np.random.permutation(train_x.shape[0])
    shuffled_x = train_x[shuffle_index]
    shuffled_y = train_y[shuffle_index]
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.plot(train_x,train_y,lw=5,c='r')
    plt.ion()
    plt.show()
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for i in range(5000000):
            feed_dic = {x:shuffled_x,y_:shuffled_y}
            _,train_loss = sess.run([train_step,loss],feed_dict=feed_dic)
            if (i+1)%1000 == 0:
                print('loss at train data: ',train_loss)
                try:
                    ax.lines.remove(lines[0])
                except:
                    pass
                y_pre = sess.run(logits,feed_dict={x:train_x})
                lines = ax.plot(train_x,y_pre,c='black')
                plt.pause(0.1)

if __name__ == '__main__':
    train()

エラーが発生したプログラムを実行します。AttributeError: module 'tensorflow' has no attribute 'placeholder'

いろいろ調べた結果、パソコンのtensorflowがバージョン2.0で、プログラムがバージョン1.0をベースにしていることが原因でした。

解決方法

を配置します。

import tensorflow as tf


次の2つの文章に置き換えてください。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

完璧に動作します。

tensorflow 2.0の1.xと比較した変更点を添付します。

1. 主な変更点の簡単なまとめ

1.1. APIのクリーンアップ

tensorflow 2.0に含まれる多くのAPI 削除または移動 . 大きな変更点としては tf.app tf.flags tf.logging を、現在オープンソースの absl-py を削除し tf.contrib の項目を削除し、メインの tf.* のような関数に移動し、あまり使われない関数は tf.math のようなサブパッケージがあります。いくつかのAPIは、2.0バージョンと同等のものに置き換えられています。 tf.summary , tf.keras.metrics tf.keras.optimizers .
これらのリネームを自動的に適用する最も簡単な方法は v2アップグレードスクリプト .

1.2. イーガー実行

TensorFlow 1.Xでは、イーガー実行を行うために、次のような操作を行う必要があります。 tf.* API を呼び出して、抽象構文木 (グラフ) を手動でつなぎ合わせます。次に、出力テンソルと入力テンソルのセットを作成し、それらを session.run() を使い、手動で抽象構文木をコンパイルする。
TensorFlow 2.0のデフォルトはEager実行モードで、(Pythonが通常行うように)すぐにコードを実行します。2.0では、グラフとセッションは実装の詳細のように動作するはずです。

Eager実行の注目すべき点の1つは、(1)のように tf.control_dependencies() すべてのコードは順次実行されるため ( tf.function で、副作用は書かれた順に実行される)。

1.3. グローバル変数の廃止

TensorFlow 1.Xは、暗黙のグローバル名前空間に大きく依存しています。を呼び出すと tf.Variable() を指すPython変数を忘れたとしても、デフォルトのグラフに格納され、そこに留まります。
を復元することができます。 tf.Variable しかし、その変数が作成された名前がわかっている場合のみ、その変数の作成を制御できない場合は困難です。その結果、ユーザーが自分の変数を再び見つけられるようにする仕組みや、ユーザーが作成した変数を見つけるためのフレームワークを探すことが盛んに行われるようになりました。 tf.get_global_step() , tf.global_variables_initializer() また,オプティマイザは,暗黙のうちにすべての学習可能な変数の勾配を計算する,などです.

TensorFlow 2.0ではこれらの仕組みがすべて削除されています( 変数 2.0 RFC ) をサポートし、デフォルトのメカニズムである変数の追跡をサポートします! もし、tf.Variableの追跡ができなくなったら、それはガベージコレクションされてリサイクルされるでしょう。

トレース変数が必要なため、ユーザーには追加作業が発生しますが、Kerasオブジェクト(下記参照)を使用することで、負担を最小限に抑えることができます。

1.4. セッションではなく、関数

session.run() 呼び出しはほとんど関数呼び出しのように、入力と呼び出す関数を指定し、出力のセットを返します。
TensorFlow2.0では、以下のように tf.function() を使用してPython関数を装飾し、JITコンパイル用にマークすることで、TensorFlowが個々のグラフとして実行できるようになります( ファンクション 2.0 RFC ). この仕組みにより、TensorFlow 2.0は、グラフモデルのすべての利点を得ることができます。

  • パフォーマンス:機能の最適化が可能(ノードの刈り込み、カーネルフュージョンなど)
  • 移植性:その機能をエクスポート/再インポートできる( SavedModel 2.0 RFC これにより、TensorFlowのモジュール化された機能を再利用、共有することができる。
# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)


PythonとTensorFlowのコードを自由に補間することで、Pythonの表現力を存分に活かしてもらいたいと考えています。しかし、移植性の高いTensorFlowは、Pythonインタプリタがなくても、モバイル、C++、JSで実行できるため、ユーザは、Pythonに @tf.function コードを書き換える際に オートグラフ は、PythonのコンストラクトのサブセットをTensorFlowの同等物に変換します。

  • for / while -> tf.while_loop (サポート break continue )
  • if ->
    tf.cond
    for _ in dataset
    
  • -> dataset.reduce

AutoGraphは制御フローの任意のネストをサポートしており、シーケンスモデル、強化学習、カスタム学習ループなど、多くの複雑なMLプログラムを効率的かつ簡潔に実装することが可能です。