2017-12-21 1 views
1

タイトルが示唆するように、私は同じSession.run()呼び出しで複数のTensorflow操作を実行したいと思います。具体的には、問題をより具体的にするために、1回の呼び出しで複数のトレーニング反復を実行するとします。同じSession.run()コールでの複数のシーケンシャルTensorflow操作

複数でSession.run()の呼び出しはこのようなものになるだろうことを行うための標準的な方法:我々は、複数のセッションの呼び出しを行っているので、

# Declare the function that we want to minimize 
func = ... 

# Create the optimizer which will perform a single optimization iteration 
optimizer = tf.train.AdamOptimizer().minimize(func) 

# Run N optimization iterations 
N = 10 
with tf.Session() as sess: 

    sess.run(tf.global_variables_initializer()) 
    for i in range(N): 
     sess.run(optimizer) 

しかし、もちろんこれは、いくつかのオーバーヘッドを持っています。私は、何らかの形で操作をグループ化することによって、いくらかの重大なオーバーヘッドを取り除くことができると考えていますgroupまたはcount_up_toのいずれかを使用する必要がありますが、このケースで使用する方法を示す例は見つかりません。誰かが正しい方向に私を指差してくれますか?

究極の目標は、上記のようなものに変換することができるように、単一の呼び出しでNの反復を実行しますいくつかの化合物の操作を定義することです:

# Declare the function that we want to minimize 
func = ... 

# Create the optimizer which will perform a single optimization iteration 
optimizer = tf.train.AdamOptimizer().minimize(func) 

# Create the compound operation that will run the optimizer 10 times 
optimizeNIterations = ????? 
with tf.Session() as sess: 

    sess.run(tf.global_variables_initializer()) 
    sess.run(optimizeNIterations) 

EDIT ::

として、 musically_utが指摘するように、問題を強制的にフィード辞書に入れることで、私は実際に操作を連鎖させることができます。しかし、それは非常に特定した問題の解決策のように感じます。私の全体的な関心事は、1回のセッション実行で順次操作を実行する方法です。私はあなたがこれを望む理由をもう一つ挙げることができます....

私のオプティマイザを実行したいだけでなく、最適化された値を取得したいと思います。これらは変数Xにあります。私は最適化し、最適化された値を取得したい場合は、私はこの

with tf.Session() as sess: 

    sess.run(tf.global_variables_initializer()) 
    o, x = sess.run([ optimizer, X ]) 

ようしかし、操作(オプティマイザ、X)を順次実行していないので、これは動作しません、実際に何かをしようとすることができます。私は基本的に2つのセッションコールを持つ必要があります:

with tf.Session() as sess: 

    sess.run(tf.global_variables_initializer()) 
    o = sess.run(optimizer) 
    x = sess.run(X) 

質問は、これら2つの呼び出しを1つに結合する方法です。

+0

あなたは 'feed_dict'を使用していないとして、私はあなたがキューを使用して入力に供給していると仮定?その場合、おそらく 'sess.run([optimizer] * N)'も同様に効率的です。しかし、オーバーヘッドが最適化するのに十分なほど重要かどうかはわかりませんが、手元にある数字はありますか? –

+0

私は両方のシナリオを持っています(フィードdictsの有無にかかわらず)。私の理解は、あなたが提案していることは、順番に実行することを保証されていないということでした... –

+0

私はちょうどチェックしました。あなたが提案するものは、同じコマンドを何度も実行しません。結果は 'sess.run(optimizer)'と同等です。 –

答えて

2

tf.while_loopで複数回実行したい操作を入力できるように思えます。操作が独立している場合は、parallel_iterations1に設定するか、(より良い)制御依存関係を使用してオプティマイザ呼び出しを順序付けする必要があります。たとえば、次のように

import tensorflow as tf 

with tf.Graph().as_default(): 
    opt = tf.train.AdamOptimizer(0.1) 
    # Use a resource variable for a true "read op" 
    var = tf.get_variable(name="var", shape=[], use_resource=True) 
    def _cond(i, _): 
    return tf.less(i, 20) # 20 iterations 
    def _body(i, sequencer): 
    with tf.control_dependencies([sequencer]): 
     loss = .5 * (var - 10.) ** 2 
     print_op = tf.Print(loss, ["Evaluating loss", i, loss]) 
    with tf.control_dependencies([print_op]): 
     train_op = opt.minimize(loss) 
    with tf.control_dependencies([train_op]): 
     next_sequencer = tf.ones([]) 
    return i + 1, next_sequencer 
    initial_value = var.read_value() 
    with tf.control_dependencies([initial_value]): 
    _, sequencer = tf.while_loop(cond=_cond, body=_body, loop_vars=[0, 1.]) 
    with tf.control_dependencies([sequencer]): 
    final_value = var.read_value() 
    init_op = tf.global_variables_initializer() 
    with tf.Session() as session: 
    session.run([init_op]) 
    print(session.run([initial_value, final_value])) 

プリント:

2017-12-21 11:40:35.920035: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][0][46.3987083] 
2017-12-21 11:40:35.920317: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][1][45.4404] 
2017-12-21 11:40:35.920534: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][2][44.4923515] 
2017-12-21 11:40:35.920715: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][3][43.55476] 
2017-12-21 11:40:35.920905: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][4][42.6277695] 
2017-12-21 11:40:35.921084: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][5][41.711544] 
2017-12-21 11:40:35.921273: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][6][40.8062363] 
2017-12-21 11:40:35.921426: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][7][39.9120026] 
2017-12-21 11:40:35.921578: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][8][39.028965] 
2017-12-21 11:40:35.921732: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][9][38.1572723] 
2017-12-21 11:40:35.921888: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][10][37.2970314] 
2017-12-21 11:40:35.922053: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][11][36.4483566] 
2017-12-21 11:40:35.922187: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][12][35.6113625] 
2017-12-21 11:40:35.922327: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][13][34.7861366] 
2017-12-21 11:40:35.922472: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][14][33.9727631] 
2017-12-21 11:40:35.922613: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][15][33.1713257] 
2017-12-21 11:40:35.922777: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][16][32.3818779] 
2017-12-21 11:40:35.922942: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][17][31.6044941] 
2017-12-21 11:40:35.923115: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][18][30.8392067] 
2017-12-21 11:40:35.923253: I tensorflow/core/kernels/logging_ops.cc:79] [Evaluating loss][19][30.0860634] 
[0.36685812, 2.3390481] 
関連する問題