比较两个 Tensorflow 图

Compare Two Tensorflow Graphs

比较两个 GCMLE 部署的预测模型并确定其图形中的差异的最简单方法是什么?我已经目视检查了两个张量板,它们看起来完全一样(它们应该是一样的)。但是,我有代码来可视化它们的激活(基本上只是从图中加载权重并手动执行所有前向步骤)并且在其中一张图的某个地方我手写的前向传递计算与 tensorflow 的前向传递计算不同。用于训练模型的代码应该是相同的,但相同的前向传播似乎只对其中一个模型是准确的。有没有办法比较结构?

除了检查张量板,我还分别尝试了以下方法:

model1_tensors = [n.name for n in tf.get_default_graph().as_graph_def().node]
model2_tensors = [n.name for n in tf.get_default_graph().as_graph_def().node]

最终,基于比较 set() 的差异,张量名称等也没有明显差异(表明它们是同一张图):[n.name for n in tf.get_default_graph().as_graph_def().node] 每个 saved_models.

鉴于相同的前向传递代码对一个模型产生准确的结果而对另一个模型没有产生准确的结果,我非常相信图表是不同的,但我挠头指出差异是什么.

更进一步,我实际上有信心我知道计算发生分歧的确切层(它与批量规范层),所以如果有一种方法可以输出进入特定的所有张量层然后我可能能够确定还有其他事情正在做。

我发现的最佳方法是获取 GraphDef 对象并使用 tensorflow 测试比较它们..

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], _VERSION_2)  
    graph_1 = tf.get_default_graph().as_graph_def()

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], _VERSION_2)  
    graph_2 = tf.get_default_graph().as_graph_def()

然后我可以用这些来比较两个图:

from tensorflow.python import pywrap_tensorflow
diff = pywrap_tensorflow.EqualGraphDefWrapper(graph_65.SerializeToString(), # actual
                                          graph_60.SerializeToString()) # expected
print(diff)

这似乎显示了一个差异,但并未显示所有差异。