1

私は交互のトレーニングスキームを実装しています。グラフには2つのトレーニング操作が含まれています。トレーニングはこれらの間で交互に行われるべきです。列車運転をテンソルフローで交代するには?

これはthisまたはthis

などの研究に関連しては、以下の小さな一例です。しかし、それはすべてのステップで両方の操作を更新するようです。これらを明示的に交互に切り替えるには

from tensorflow.examples.tutorials.mnist import input_data 
import tensorflow as tf 
# Import data 
mnist = input_data.read_data_sets('/tmp/tensorflow/mnist/input_data', one_hot=True) 

# Create the model 
x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10]), name='weights') 
b = tf.Variable(tf.zeros([10]), name='biases') 
y = tf.matmul(x, W) + b 

# Define loss and optimizer 
y_ = tf.placeholder(tf.float32, [None, 10]) 
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) 
global_step = tf.Variable(0, trainable=False) 

tvars1 = [b] 
train_step1 = tf.train.GradientDescentOptimizer(0.5).apply_gradients(zip(tf.gradients(cross_entropy, tvars1), tvars1), global_step) 
tvars2 = [W] 
train_step2 = tf.train.GradientDescentOptimizer(0.5).apply_gradients(zip(tf.gradients(cross_entropy, tvars2), tvars2), global_step) 
train_step = tf.cond(tf.equal(tf.mod(global_step,2), 0), true_fn= lambda:train_step1, false_fn=lambda : train_step2) 


sess = tf.InteractiveSession() 
tf.global_variables_initializer().run() 


# Train 
for i in range(1000): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 
    if i % 100 == 0: 
     print(sess.run([cross_entropy, global_step], feed_dict={x: mnist.test.images, 
             y_: mnist.test.labels})) 

これには、両方の列車OPSが毎回train_stepが呼び出され実行される1802に

[2.0890141, 2] 
[0.38277805, 202] 
[0.33943111, 402] 
[0.32314575, 602] 
[0.3113254, 802] 
[0.3006627, 1002] 
[0.2965056, 1202] 
[0.29858461, 1402] 
[0.29135355, 1602] 
[0.29006076, 1802]  

にグローバル段差反復をもたらします。 (これは、常時偽の条件が例えばtf.equal(global_step,-1)の場合にも発生します)

私の質問は、train_step1train_step2の実行を交互に行う方法ですか?

答えて

2

私は最も簡単な方法は、ちょうど

for i in range(1000): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    if i % 2 == 0: 
    sess.run(train_step1, feed_dict={x: batch_xs, y_: batch_ys}) 
    else: 
    sess.run(train_step2, feed_dict={x: batch_xs, y_: batch_ys}) 

だと思う。しかしこのようにそれを行う、tensorflow条件付きフローを介してスイッチを行う必要があります場合:

optimizer = tf.train.GradientDescentOptimizer(0.5) 
train_step = tf.cond(tf.equal(tf.mod(global_step, 2), 0), 
        true_fn=lambda: optimizer.apply_gradients(zip(tf.gradients(cross_entropy, tvars1), tvars1), global_step), 
        false_fn=lambda: optimizer.apply_gradients(zip(tf.gradients(cross_entropy, tvars2), tvars2), global_step)) 
+0

私は 'TFにこれをフィットする必要があります、「esimator」API(1つのtrain_opを必要とする)。したがって、あなたは私が参照してください –

+0

@RobRomijndersを提案するように私はforループでそれを行うことはできません。その後、2番目の変種は動作するはずです – Maxim

+0

はい、それは動作します。唯一の違いは、あなたのソリューションが 'tf.cond()'に沿って 'train_step1'を定義していることです。なぜそれが違いになるのか? –

関連する問題