我正在尝试执行两项任务(A和B),其中包含输入inp_A
和inp_B
以及相应的输出out_A
,out_B
。
任务A首先由图g_A
实现。任务A完成后,我希望将g_A
的权重用于新图g_B
,这是一个更大的图表(g_A
的超集)。
我不确定如何在tensorflow中执行此操作。
答案 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()
实例中起作用,但我对此表示怀疑。