1
私は交互のトレーニングスキームを実装しています。グラフには2つのトレーニング操作が含まれています。トレーニングはこれらの間で交互に行われるべきです。列車運転をテンソルフローで交代するには?
などの研究に関連しては、以下の小さな一例です。しかし、それはすべてのステップで両方の操作を更新するようです。これらを明示的に交互に切り替えるには
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_step1
とtrain_step2
の実行を交互に行う方法ですか?
私は 'TFにこれをフィットする必要があります、「esimator」API(1つのtrain_opを必要とする)。したがって、あなたは私が参照してください –
@RobRomijndersを提案するように私はforループでそれを行うことはできません。その後、2番目の変種は動作するはずです – Maxim
はい、それは動作します。唯一の違いは、あなたのソリューションが 'tf.cond()'に沿って 'train_step1'を定義していることです。なぜそれが違いになるのか? –