Skip to main content
 首页 » 编程设计

python之tensorflow 中不同依赖图的两阶段训练

2025年02月15日28qq号

我正在尝试执行两个任务(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() 实例工作,尽管我对此表示怀疑。