张量流中不同依赖图的两阶段训练

时间:2017-02-04 22:48:21

标签: python tensorflow deep-learning

我正在尝试执行两项任务(A和B),其中包含输入inp_Ainp_B以及相应的输出out_Aout_B

任务A首先由图g_A实现。任务A完成后,我希望将g_A的权重用于新图g_B,这是一个更大的图表(g_A的超集)。

我不确定如何在tensorflow中执行此操作。

1 个答案:

答案 0 :(得分:1)

我正在使用这种分割进行培训和验证,我创建了专用的输入和输出管道但共享图的初始部分,尽管我使用了相同的 (截至tf.Graph()),但其中包含不同的(未连接的)子图

在一个tf.Graph()中,一般概念是variable sharing,您可以使用tf.variable_scope()按概念对变量进行分组,然后使用tf.get_variable()创建和重新创建变量。而不是直接使用tf.Variable()。它第一次调用它将创建变量,第二次它将重用它们 - 只要变量的名称保持不变。

然而,我发现使用tf.make_template()更容易,它将包装一个完全创建子图的函数,并在每次调用时创建图的新实例,同时共享其所有变量。 文档示例是

def my_op(x, scalar_name):
  var1 = tf.get_variable(scalar_name,
                         shape=[],
                         initializer=tf.constant_initializer(1))
  return x * var1

create_instance = tf.make_template('scale_by_y', my_op, scalar_name='y')

z = create_instance(input1)
w = create_instance(input2)

此处,每次调用create_instance都会在图中创建一个名为scale_by_y的新节点,该节点在共享其内部变量时执行my_op()定义的操作。 (在示例中,参数scalar_name静态绑定到y的值,导致在图中创建(并重用)变量scale_by_y/y。我发现更多令人困惑而不是有用。) 它不关心父范围,所以

with tf.variable_scope('training'):
    z1 = create_instance(input1)

with tf.variable_scope('validation'):
    z2 = create_instance(input2)

的工作原理。它也可能会或可能不会在不同的tf.Graph()实例中起作用,但我对此表示怀疑。