我想在同一个TensorFlow会话中训练和测试我的模型。我使用两个不同的tf.FIFOQueue
来通过多线程加载训练和测试数据(因为feed_dict
会导致性能不佳)。我尝试了两种方法:
-
我尝试创建两个模型(用于训练和测试)并共享参数。但我使用了
tf.contrib.layers.batch_norm
,它不允许共享批量归一化的参数。 -
我尝试根据
is_training
布尔占位符来条件化网络的输入tf.FIFOQueue
,使用tf.cond
,但显然tf.cond
会执行两个tf.FIFOQueue
的出队函数,无论is_training
的值是什么。
我想知道在同一会话中训练和测试的常规设置是什么,且不使用feed_dict
。
回答:
显然,如果在全局tf.variable_scope
中定义,tf.contrib.layers.batch_norm
确实允许共享批量归一化参数。
示例代码:摘自这里。
def model(data, is_training=False, reuse=None, scope='my_model'): # 定义一个变量范围来包含模型的所有变量 with tf.variable_scope(scope, 'model', data, reuse=reuse): .... net = tf.contrib.layers.batch_norm(net, is_training) return nettrain_outputs = model(train_data, is_training=True)eval_outputs = model(eval_data, is_training=False, reuse=True)