我正在尝试执行两个任务(A 和 B),它们具有输入 inp_A 和 inp_B 以及相应的输出 out_A, out_B.
任务 A 首先要通过图 g_A 来实现。任务 A 完成后,我希望将 g_A 的权重用于新图 g_B,这是一个更大的图(g_A 的超集) ).
我不确定如何在 tensorflow 中执行此操作。
请您参考如下方法:
我将这种拆分用于训练和验证目的,我在其中创建专用的输入和输出管道但共享图的初始部分,尽管我使用相同的图(如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 静态绑定(bind)到 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() 实例工作,尽管我对此表示怀疑。
