2016-06-02 5 views
2

最近、TFRecordsファイルから生成されたキューから入力を読み取るfully_connectedスタイルモデルに移行しました。これははるかに効率的であることが証明されていますが、私はplaceholder/feed_dictと対話的にパラメータを渡したいと思います。TensorFlowでキューベースとフィードベースの入力を混合する方法

feed_dictとfull_connectedの両方の機能について同じ計算グラフを使用する方法がありますか(initメソッドでグラフを作成するモデルクラスがあります)デキューから値を受け取るプレースホルダを取得できますか?

答えて

3

デキュー操作の出力を簡単に入力できます。 TensorFlowは実際にアイテムをデキューしません。指定した値をそのまま使用します。たとえば、

q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], shapes=[()]) 
v = tf.placeholder(tf.float32) 
enqueue = q.enqueue([v]) 
dequeue = q.dequeue() 
output = dequeue + 10.0 

with tf.Session() as sess: 
    sess.run(enqueue, feed_dict={v: 1.0}) 
    sess.run(enqueue, feed_dict={v: 2.0}) 
    sess.run(enqueue, feed_dict={v: 3.0}) 
    print(sess.run(output)) # 11.0 
    print(sess.run(output, feed_dict={dequeue: 5.0})) # 15.0 
    print(sess.run(output)) # 12.0 
    print(sess.run(output)) # 13.0 
+0

それは面白いです...あなたは確かに実行されますか?たとえば、デキューは「プレースホルダ」ではないため、フィードを送れますか? – user3391229

+0

はい、うまくいきます(TensorFlow 0.10.0rc1で試しました)。要点は、TensorFlowでは、プレースホルダだけでなく、* any *演算の出力を供給することができます。この場合、演算を評価しようとしません。実際には、一般的にプレースホルダを使用して意図を明確にしているので、代わりにプレースホルダを使用することをおすすめしますが、この特定のケースでは、単純化してプレースホルダを忘れることはやや自然です。 – MiniQuark

+0

これは大変感謝しています。私の世界観は少し変わった – user3391229

8

最近追加された(TensorFlow 0.8)tf.placeholder_with_default() opを使用することもできます。デフォルト値(通常はキュー/リーダーの出力)を指定できます。また、異なる値形。

たとえば、キュ​​ーには32個の要素のバッチが生成され、各要素には784個のフィーチャがあり、32 x 784の行列が与えられます。

input_from_queue = ... # e.g. `queue.dequeue_many(32)` or `tf.train.batch(..., 32)` 
# input_from_queue.get_shape() ==> (32, 784) 

input = tf.placeholder_with_default(input_from_queue, shape=(None, 784)) 
# input.get_shape() ==> (?, 784) 

# ... 
train_op = ... 

sess.run(train_op) # Takes examples from `queue`. 
sess.run(train_op, feed_dict={input: ...}) # Takes examples from `feed_dict`. 

これは、可変サイズのバッチで飼料または所望に応じて、入力されたリーダーを使用することを可能にします。

+1

Sweet !!あなたはいつもSO /テンソルフローのためにmrryを期待することができます.. – user3391229

+0

ちょうど興味深い:なぜプレースホルダが必要ですか?あなたはそれなしで同じ結果を得られないでしょうか?単に 'train_op'を実行しているときに' input_from_queue'オペレーションの出力を送り、AFAIU TensorFlowはキューから引き出されません。 – MiniQuark

+0

プレースホルダを使用すると、異なるサイズのバッチを計算に送り込むことができます。 'input_from_queue'が固定されたバッチサイズを持っていて(そうではないかもしれませんが)、そのテンソルに異なるサイズのバッチを供給しようとすると、エラーが発生します。 – mrry

関連する問題