2017-07-17 7 views
1

今は入力をfeed_dictにするように設定されたモデルがあります。コードは次のようになります。TensorFlowモデルへの入力のためにfeed_dictとqueueを簡単に切り替える

# model.py 
class MyModel(object): 
    def __init__(self, hyperparams): 
    self.build_model(hyperparams) 

    def build_model(self, hps): 
    self.input_data = tf.placeholder(dtype=tf.float32, shape=[hps.batch_size, hps.nfeats]) 
    self.labels = tf.placeholder(dtype=tf.float32, shape=[hps.batch_size]) 
    # Define hidden layers, loss, training step, etc. 

# train.py 
model = MyModel(hps) 
for _ in range(100): 
    x, y = some_python_function() # Read a batch from disk, preprocess 
    sess.run(model.train_step, feed_dict={model.input_data: x, model.labels: y}) 

パフォーマンス上の理由から、トレーニング用にキューを使用したいと思います。しかし、私はfeed_dictを使用する能力を維持したいと思います。推論やテストのために。

これを行うにはエレガントな方法がありますか?私がしたいのは、キューを使用するときに、キューのデキュー・オペレーションによって返されたテンソルのプレースホルダ変数を「スワップ・アウト」することです。私はtf.assignはこれを行う方法、すなわち:

single_x, single_y = tf.parse_single_example(...) 
x, y = tf.train.batch([single_x, single_y], batch_size) 
model = MyModel(hps) 
sess.run([tf.assign(model.input_data, x), tf.assign(model.labels, y)]) 
for _ in range(100): 
    sess.run(model.train_step) 

だろうと思った。しかし、これはAttributeError: 'Tensor' object has no attribute 'assign'を発生させます。 tf.assignのAPIドキュメントでは、最初の引数は「変更可能なTensorです。Variableノードである必要があります。初期化されていない可能性があります。これは私のプレースホルダが変更可能でないことを意味しますか?私はそうすることができますか?または私はこれに間違った方法で近づいていますか?

最小実行可能な例here

答えて

0

グラフを制御していて、何を先にするかを知っている場合は、入力にスイッチを使用できます。例えば、

x_plh = tf.placeholder(tf.float32, myshape) 
x_dsk = my_input_from_disk() 
use_dsk = tf.placeholder(tf.bool,()) 
x = tf.cond(use_dsk, lambda: x_dsk, lambda: x_plh) 

は、あなたがより柔軟なソリューションを必要とややパイオニアルートを取る場合は、tensorflowの Dataset APIを行くかもしれません。ドキュメントを読む時間を取る、それは素敵な読書です。単一の Iteratorには、あなたのケースに合った別のイニシャライザをいくつか使用することができます。

2

あなたがでVariablesOperationsの作成を分けることができます:それはあなたを受け入れるよう

  • 、あなたのModelクラスのインスタンス化時に呼び出さbuild_variablesメソッドを追加すること

    • build_modelメソッドのインターフェースを変更しますxyテンソルを引数とするため、それらに基づいてモデルoperationsを構築します。

    このようにして、モデルの変数と定数を再利用します。欠点は、placeholderバージョンとそれ以外のバージョンで操作が複製されることです。

    import tensorflow as tf 
    import numpy as np 
    
    BATCH_SIZE = 2 
    
    class Model(object): 
    
        def __init__(self): 
        self.build_variables() 
    
        def build_variables(self): 
        self.w = tf.Variable(tf.random_normal([3, 1])) 
    
        def build_model(self, x, y): 
        self.x = x 
        self.y = y 
        self.output = tf.matmul(self.x, self.w) 
        self.loss = tf.losses.absolute_difference(self.y, self.output) 
    
    
    model = Model() 
    sess = tf.InteractiveSession() 
    sess.run(tf.global_variables_initializer()) 
    
    def placeholder_run(): 
        x = tf.placeholder(dtype=tf.float32, shape=[BATCH_SIZE, 3]) 
        y = tf.placeholder(dtype=tf.float32, shape=[BATCH_SIZE, 1]) 
        model.build_model(x, y) 
    
        for i in range(3): 
        x = np.random.rand(BATCH_SIZE, 3) 
        y = x.sum(axis=1, keepdims=True) 
        loss = sess.run(model.loss, feed_dict={model.x:x, model.y:y}) 
        print(loss) 
    
    def nonph_run(): 
        x = tf.random_normal([BATCH_SIZE, 3]) 
        y = tf.reduce_sum(x, axis=1, keep_dims=True) 
        model.build_model(x, y) 
        for i in range(3): 
        loss = sess.run(model.loss) 
        print(loss) 
    
    if __name__ == '__main__': 
        # Works 
        placeholder_run() 
        # Doesn't fail 
        nonph_run() 
    
  • 関連する問題