如何查看两个协议缓冲区文件 (.pb) 是否相同?
How can I see if two protocol buffer files (.pb) are the same?
我有一堆用 Tensorflow
和 Keras
创建的模型的协议缓冲区文件,我想看看哪些是相同的。我的第一个想法是使用 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 .
我有一堆用 Tensorflow
和 Keras
创建的模型的协议缓冲区文件,我想看看哪些是相同的。我的第一个想法是使用 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 .