【发布时间】:2019-01-27 01:28:58
【问题描述】:
我正在尝试从两个几乎相同的模型中创建一个模型,在不同的条件下进行训练,并在 在 tensorflow 内平均它们的输出。我们希望最终模型具有相同的推理接口。
我们已经保存了两个模型的检查点,下面是我们尝试解决问题的方法:
merged_graph = tf.Graph()
with merged_graph.as_default():
saver1 = tf.train.import_meta_graph('path_to_checkpoint1_model1.meta', import_scope='g1')
saver2 = tf.train.import_meta_graph('path_to_checkpoint1_model2.meta', import_scope='g2')
with tf.Session(graph=merged_graph) as sess:
saver1.restore(sess, 'path_to_checkpoint1_model1')
saver1.restore(sess, 'path_to_checkpoint1_model2')
sess.run(tf.global_variables_initializer())
# export as a saved_model
builder = tf.saved_model.builder.SavedModelBuilder(kPathToExportDir)
builder.add_meta_graph_and_variables(sess,
[tf.saved_model.tag_constants.SERVING],
strip_default_attrs=True)
builder.save()
上述方法至少有3个缺陷,我们尝试了很多路线但无法让它发挥作用:
- model1 和 model2 的图有自己的主要操作。结果,模型在加载过程中失败,并出现以下错误: 失败的前提条件:
_
Expected exactly one main op in : model
Expected exactly one SavedModel main op. Found: [u'g1/group_deps', u'g2/group_deps']
-
两个模型都有自己的 Placeholder 节点用于输入(即合并后的 g1/Placeholder 和 g2/Placeholder)。我们找不到删除占位符节点的方法来创建一个新的节点来为两个模型提供输入(我们不想要一个需要将数据输入两个不同占位符的新界面)。
李> 这两个图有自己的 init_all、restore_all 节点。我们无法弄清楚如何将这些 NoOp 操作组合到单个节点中。这与问题 #1 相同。
我们也无法在 tensorflow 中找到这种模式集成的示例实现。一个示例代码可能会回答上述所有问题。
注意:我的两个模型是使用 tf.estimator.Estimator 训练的,并导出为 saved_models。因此,它们包含 main_op。
【问题讨论】:
标签: tensorflow deep-learning tensorflow-serving tensorflow-estimator ensemble-learning