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?
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 –
@RobRomijnders ich sehe. Dann sollte die zweite Variante funktionieren – Maxim
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? –