在连接的张量流图中初始化变量

时间:2017-07-13 15:28:36

标签: tensorflow tensorflow-serving

我正在尝试将单独的图表上的多个Tensorflow模型连接到单个图形上的单个模型中(我想象典型的场景是需要冻结的转移学习模型,集合等)。

我可以使用tf.import_graph_def连接这两个图。但是,当其中一个原始图形包含变量时,我无法在新图形上将值注入其中。分配操作作为图形的一部分被复制,如果我手动运行它,我会得到预期的结果。 (取消注释sess.run - 调用第四个with graph... - 阻止)

import tensorflow as tf

graph1 = tf.Graph()
with graph1.as_default():
    with tf.Session(graph=graph1) as sess:
        var1 = tf.Variable([1, 1, 1], name='var1')
        tensor1 = tf.multiply(var1, 2, name='tensor1')

graph2 = tf.Graph()
with graph2.as_default():
    with tf.Session(graph=graph2) as sess:
        placeholder = tf.placeholder(tf.int32, [3], name='placeholder')
        tensor2 = tf.multiply(placeholder, 2, name='tensor2')

graph3 = tf.Graph()
with graph3.as_default():
    with tf.Session(graph=graph3) as sess:
        graph1out, = tf.import_graph_def(graph1.as_graph_def(), name='graph1', return_elements=['tensor1:0'])
        tf.import_graph_def(graph2.as_graph_def(), name='graph2', input_map={'placeholder:0': graph1out})

with graph3.as_default():
    with tf.Session(graph=graph3) as sess:
        sess.run(tf.global_variables_initializer())
        #sess.run(graph3.get_tensor_by_name('graph1/var1/Assign:0'))
        tensor = graph3.get_tensor_by_name('graph2/tensor2:0')
        result = sess.run(tensor)

按原样运行此代码段会产生:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value graph1/var1

手动运行assign-ops是一种非常通用的方法,作为一般函数的一部分编写将会很麻烦。每当我使用图表重新初始化会话时,它还需要进行这些分配调用。

有更通用的方法吗?例如,通过创建基于旧变量的新变量并将它们锁定到现有结构?

如果没有,有没有办法包装分配电话?那么至少我可以针对每种情况运行单个通用初始化操作而不是未知数量的特定初始化操作吗?

1 个答案:

答案 0 :(得分:-1)

通过创建init-wrapper来解决这个问题。对于名称以' Apply:(int)'我使用tf.reduce_sum(标准化它们的形状)并将它们塞进tf.stack。此init操作在内部被视为noop,但它确保传递给它的每个张量都运行(因此也初始化它们的相应变量)。从语义上讲,它可以被视为tf.global_variables_initializer()。

不是最优雅的解决方案,但它适用于我的用例。