模索的プログラミング

プログラミングを嗜む大学生のメモ欄

tensorflowのFailedPreconditionErrorで詰まった話

tensorで勉強がてら簡単な関数近似のプログラムを書いていたところこんなエラーが
ソースコード

#coding: utf-8
import tensorflow as tf
import random

#-メイン文-#
if __name__ == "__main__":
    ##モデルの定義を行う
    #入力層
    #任意のユニット数の入力層から3層への結合
    _x = tf.placeholder(tf.float32,[None,3])
    #ネットワークの重み
    W1 = tf.Variable(tf.zeros([3, 1]))
    #バイアス項
    b1 = tf.Variable(tf.zeros([1]))
    #行列の計算
    y = tf.matmul(_x, W1) + b1
    ##誤差関数及び学習器の設定を行う
    #正解の値を格納するplaceholderを作成
    _y = tf.placeholder(tf.float32,[None,1])
    #誤差関数の設定
    loss = tf.reduce_sum((tf.square(_y - y)))
    #定義した全ての変数を初期化
    init = tf.initialize_all_variables()
    #学習器の設定
    train_step = tf.train.AdamOptimizer().minimize(loss)

    ####################
    # 訓練データ作成
    # 入力:3つの整数a,b,c
    # 出力:a+2b+3c
    ####################
    x_train = []
    y_train = []
    x_test = []
    y_test = []
    tmp = []
    # 訓練データの作成
    for i in range(1000):
        for j in range(3):
            tmp.append(random.randint(1, 1000))
        x_train.append(tmp)
        y_train.append([tmp[0] + 2 * tmp[1] + 3 * tmp[2]])
        tmp = []

    #-セッションの開始-#
    with tf.Session() as sess:
        sess.run(init)
        print "初期状態"
        print '誤差' + str(sess.run(loss, feed_dict={_x: x_train, _y: y_train}))
        for step in range(40000):
            sess.run(train_step,feed_dict={_x:x_train, _y:y_train})
            if (step + 1) % 20 == 0:
                print '\nStep: %s' % (step + 1)
                print '誤差' + str(sess.run(loss, feed_dict={_x:x_train, _y:y_train}))

        print sess.run(y,feed_dict={_x:[[3,4,5]]})#答えは26

○エラーメッセージ


FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta1_power
[[Node: beta1_power/read = Identity[T=DT_FLOAT, _class=["loc:@Variable"], _device="/job:localhost/replica:0/task:0/cpu:0"](beta1_power)]]


このFailedPreconditionErrorというのはプレースホルダーの初期化をしていないと起こるそうなのですが、ちゃんと初期化は行っていたので原因がわからず頭を悩ませていたんですがやっと解決方法を発見。
どうやらAdamOptimizer自体が2つの変数を生成するらしく、それらを初期化できていなかったことが原因であった。なのでinitの位置をOptimizerより後ろに変更

    #学習器の設定
    train_step = tf.train.AdamOptimizer().minimize(loss)
    #定義した全ての変数を初期化
    init = tf.initialize_all_variables()

無事、エラーが解決しました。