gpt4 book ai didi

tensorflow - 在连接的 tensorflow 图中初始化变量

转载 作者:行者123 更新时间:2023-12-03 11:23:40 25 4
gpt4 key购买 nike

我正在尝试将单独图表上的多个 Tensorflow 模型连接到单个图表上的单个模型(我认为典型场景是需要卡住的迁移学习模型、集成等)。

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

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

手动运行分配操作是一种非常小的通用方法,将其作为通用函数的一部分编写会很困惑。它还需要在每次我重新初始化与图形的 session 时进行这些分配调用。

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

如果没有,是否有包装分配调用的方法?所以至少我可以运行一个通用的初始化操作,而不是针对每种情况运行未知数量的特定初始化操作?

最佳答案

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

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

关于tensorflow - 在连接的 tensorflow 图中初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com