2016-07-10 14 views
0

テンソルフローの学習を開始しましたが、プレースホルダ/変数の問題を理解するのが難しいです。InvalidArgumentError:プレースホルダテンソルプレースホルダの値を入力する必要があります

行列乗算の関数を記述しようとしています。 tf.constantを使用したとき、それは動作しますが、私はここで、変数

の使用方法を理解する難しさを持っている私のコードは、これは期待どおりに動作

import tensorflow as tf 
import numpy as np 


mat_1 = np.array([[0,1,1,0], [1,0,1,0], [1,0,0,1], [0,1,1,0]]).astype('int32') 
mat_2 = np.array([[0,1,1,0], [1,0,1,0], [1,0,0,1], [0,1,1,0]]).astype('int32') 


def my_matmult1(mat_1, mat_2): 
    #define session 
    x_sess = tf.Session() 

    with x_sess: 
     xmat_1 = tf.constant(mat_1) 
     xmat_2 = tf.constant(mat_2) 
     r1 = tf.matmul(xmat_1, xmat_2) 
     qq1 = x_sess.run(r1) 

    return qq1  

def my_matmult2(mat_1, mat_2): 
    #define session 
    x_sess1 = tf.Session() 

    with x_sess1: 
     #initialize placeholders 
     xmat_1_plh = tf.placeholder(dtype=mat_1.dtype, shape=mat_1.shape) 
     xmat_2_plh = tf.placeholder(dtype=mat_2.dtype, shape=mat_2.shape) 

     #create variables 
     x_mat_1 = tf.Variable(xmat_1_plh, trainable = False) 
     x_mat_2 = tf.Variable(xmat_2_plh, trainable = False) 

     x_sess1.run(tf.initialize_all_variables()) 

     # 
     r1 = tf.matmul(xmat_1, xmat_2) 
     qq1 = x_sess1.run(r1, feed_dic={mat_1, mat_2}) 

    return qq1 

です:

my_matmult1(mat_1, mat_1) 

はしかし、次のように失敗します。

my_matmult2(mat_1, mat_1) 

以下のエラーがあります。

でも、私は間違って何をやっている

qq1 = x_sess1.run(r1, feed_dic={tf.convert_to_tensor(mat_1), tf.convert_to_tensor(mat_2)}) 

で最後の行を変更した後

InvalidArgumentError

You must feed a value for placeholder tensor 'Placeholder' with dtype int32 and shape [4,4]

+0

'feed_dict'は、あなたのコード内の辞書ではありません。それは受け入れられた答えです。 – AkiRoss

答えて

3

プレースホルダを作成した後に、tf.Variable()行を削除した場合は、コードを使用する必要があります(フィード変数の名前も適宜変更してください)。

プレースホルダは、モデルを供給したい変数のためのものです。変数は、モデルのパラメータ用です(ウェイトなど)。

したがって、2つのプレースホルダが正しく作成されましたが、追加の変数が何も作成されなかったため、Tensorflowグラフに何かが上がってしまう可能性があります。有意義に私は戻ってtensorflowがTensorflowで

グラフ
グラフだけである動作するように設計されてどのように行かなければならないこの質問に答えるために

import tensorflow as tf 
import numpy as np 

def my_matmult2(mat_1, mat_2): 
    #define session 
    x_sess1=tf.Session() 

    with x_sess1: 
     #initialize placeholders 
     xmat_1_plh = tf.placeholder(dtype=mat_1.dtype, shape=mat_1.shape) 
     xmat_2_plh = tf.placeholder(dtype=mat_2.dtype, shape=mat_2.shape) 

     r1 = tf.matmul(xmat_1_plh, xmat_2_plh) 

     x_sess1.run(tf.initialize_all_variables()) 

     # 

     qq1 = x_sess1.run(r1, feed_dict={xmat_1_plh: mat_1 , xmat_2_plh: mat_2}) 

    return qq1 

mat_1=np.ones((5,5)) 
mat_2=np.ones((5,5)) 

b=my_matmult2(mat_1,mat_2) 
print b 
+0

感謝を学ぼうと混乱ほんの少し。それは確かに動作します。私がTFで始まったばかりの私の考えは、実際にはnumpyで行ういくつかの行列演算をTFで置き換えることでした。私はスピードで(1)大きなマトリックスで(2)コアを克服することを望みます。しかし、私が言ったように私はちょうど学んでいる – user1043144

1

辞書が正しく入力されていない。プレースホルダの名前に辞書を設定する必要があります。私も名前を付け加えました。あなたは名前として "xmat_1_plh"を使うことができるかもしれませんが、自分の名前を追加することを好みます。私はまた、あなたはいくつかの余分な行をmy_matmult2()関数にあると思います。 x_mat_1/2、私はあまりを追加するとは思いませんが、おそらくグラフに別のOPを追加することによって、多分(少しパフォーマンスを傷つけることはありません。

def my_matmult2(mat_1, mat_2): 
#define session 
x_sess1 = tf.Session() 

with x_sess1: 
    #initialize placeholders 
    xmat_1_plh = tf.placeholder(dtype=mat_1.dtype, shape=mat_1.shape, name ="xmat1") 
    xmat_2_plh = tf.placeholder(dtype=mat_2.dtype, shape=mat_2.shape, name ="xmat2") 

    #create variables 
    x_mat_1 = tf.Variable(xmat_1_plh, trainable = False) 
    x_mat_2 = tf.Variable(xmat_2_plh, trainable = False) 

    x_sess1.run(tf.initialize_all_variables()) 

    # 
    r1 = tf.matmul(xmat_1, xmat_2) 
    qq1 = x_sess1.run(r1, feed_dic={xmat1: mat_1, xmat2: mat_2}) 

return qq1 

私はあなたの最終的な目標は、この関数の何であるかわかりません、グラフの中にノードを作成しているので、この関数から ".run()"ステートメントを移動したい場合があります(2行列を積極的に乗算したい場所へ)あなただけの2行列を乗算する方法を探している場合はループで。

これは、単一のテストの場合は/(my_matmult2するために呼び出す)、何を持っていることは、辞書に補正して動作するはずです。

+0

ありがとうございますが、私は恐れますが、それでも動作しません。この機能は本番用ではありません。プレースホルダ/変数/定数と@jean – user1043144

1

機能は次のようになります。計算に必要なマップ/パス。値を保持せず、何も実行しません。一方、

セッション
、セッションは、グラフ、データ、および実行するための実行時間を必要とします。 Graphs and Sessionsのこのコンセプトにより、TensorFolowは実際の計算ランタイムからフロー定義またはモデルを分離できます。

これは、おそらく、実行時の設定とデータと実際の実行からグラフ定義を分離するために行われたフローグラフ
から実行時間を分離。たとえば、ランタイムはクラスタ上にある可能性があります。したがって、クラスタ内の各実行ランタイムは、グラフの同じ定義を持つ必要があります。しかし、各実行時には、実行プロセス中にローカルに異なるデータセットが存在する可能性があります。したがって、クラスタ内の分散実行中に入出力データを供給することが重要です。

なぜプレースホルダと変数でないのか
プレースホルダはグラフの入力/出力コンジットとして機能します。グラフをノードの数として視覚化すると、プレースホルダは入力ノードまたは出力ノードになります。

本当の問題は、なぜTensorFlowは、I/Oノードのための通常の変数を使用していないのですか?なぜ別のタイプがあるのですか? (プログラムは、セッションで実行されている)トレーニングプロセス中

、実際の値は、モデルを訓練するために使用されることを保証する必要があります。トレーニングプロセス内の基本的にfeed_dictは、実際の値のみを受け入れます。ナンシーな恋人。これらの実際の値Tensorflow変数はevalのない限り、データを持っていないとして、TensorFlow変数によって供給することができません()またはsession.run()が使用されています。したがって、それはデータにテンソル変数を解決するために、別のsession.run()は内部を取ることができない - しかし、トレーニング文自体はsession.run()関数の一部です。この時点までに、session.run()は特定の実行時設定とデータにすでにバインドする必要があります。

関連する問題