1

Ich implementiere ein alternierendes Trainingsprogramm. Die Grafik enthält zwei Trainingsoptionen. Das Training sollte zwischen diesen wechseln.Wie wechseln Sie Zug-Operationen in Tensorflow?

Dies ist relevant für die Forschung wie this oder this

Unten finden Sie ein kleines Beispiel. Aber es scheint bei jedem Schritt beide Ops zu aktualisieren. Wie kann ich explizit zwischen diesen wechseln?

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})) 

Dies führt zu

[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]  

Die globalen Schritt iteriert bis 1802, so dass beide Zug ops werden jedes Mal ausgeführt train_step genannt wird. (Dies passiert auch, wenn die "immer falsch" -Bedingung beispielsweise tf.equal(global_step,-1) ist.)

Meine Frage ist, wie man zwischen der Ausführung von train_step1 und train_step2 wechselt?

Antwort

2

Ich denke, die einfachste Art und Weise

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}) 

gerade ist, aber wenn es notwendig, einen Schalter über tensorflow bedingten Fluss zu machen, es zu tun auf diese Weise:

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

ich diese passen muß in 'tf , esimator' API, die eine train_op benötigt. Daher kann ich es nicht in der For-Schleife wie Sie vorschlagen –

+0

@RobRomijnders ich sehe. Dann sollte die zweite Variante funktionieren – Maxim

+0

ja, es funktioniert. Es scheint der einzige Unterschied zu sein, dass Ihre Lösung den 'train_step1' in Übereinstimmung mit' tf.cond() 'definiert. Irgendeine Idee, warum das den Unterschied macht? –