如何在TensorFlow中交替执行训练操作?

我正在实现一种交替训练方案。图中包含两个训练操作。训练过程应该在这两个操作之间交替进行。

这对于像这篇这篇这样的研究是相关的

下面是一个小例子。但似乎每次都更新了这两个操作。我如何明确地在这两个操作之间交替执行?

from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf# 导入数据mnist = input_data.read_data_sets('/tmp/tensorflow/mnist/input_data', one_hot=True)# 创建模型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# 定义损失和优化器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()# 训练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}))

结果是

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

全局步骤迭代到了1802,因此每次调用train_step时都会执行两个训练操作。(例如,当总是为假的条件是tf.equal(global_step,-1)时也会发生这种情况。)

我的问题是如何交替执行train_step1train_step2


回答:

我认为最简单的方法是

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注