如何查看两个协议缓冲区文件 (.pb) 是否相同?

How can I see if two protocol buffer files (.pb) are the same?

我有一堆用 TensorflowKeras 创建的模型的协议缓冲区文件,我想看看哪些是相同的。我的第一个想法是使用 hashlib.md5,但我发现 运行 将图形冻结到 .pb 文件中的相同脚本会导致 .pb 具有不同哈希值的文件。

以下是我创建 .pb 文件的方式:

from keras import backend as K
import tensorflow as tf
from tensorflow.python.framework.graph_util import convert_variables_to_constants
K.set_learning_phase(0)
keras_session = K.get_session()
graph = keras_session.graph
graph.as_default()
keep_var_names=None
output_names=[out.op.name for out in model.outputs]
clear_devices=True
with graph.as_default():
    freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
    output_names = output_names or []
    output_names += [v.op.name for v in tf.global_variables()]
    # Graph -> GraphDef ProtoBuf
    input_graph_def = graph.as_graph_def()
    if clear_devices:
        for node in input_graph_def.node:
            node.device = ""
    frozen_graph = convert_variables_to_constants(keras_session, input_graph_def,
                                                  output_names, freeze_var_names)
tf.train.write_graph(frozen_graph, "model", "my_model.pb", as_text=False)

有办法吗?

protobuf 没有正式保证从语义相同的输入中获得完全相同的输出;特别是:

  • 字段的顺序可以改变:
    • 虽然以 field/tag 顺序写入单个块的数据很常见,但不需要(读者 required 接受乱序字段)
    • 多次写入(串联)构造的数据不保证字段顺序
  • 标记为"packed"的字段可以打包也可以不打包;由写作库决定使用哪个
  • "varint"编码本身就有歧义;额外的不必要字节是意外的,但在技术上并不违法 - 您可以在实际值之后编码多个 7 零位块,例如

如果你想检查语义相等性,你必须解析数据并post处理that .