使用 protoc 读取 Google 协议缓冲区 .pb 文件



我已经从源代码编译了Google Protobuf并生成了protoc二进制文件。现在,给定一个.pb文件,即tensorflow_inception_v3_stripped_optimized_quantized.pb如何在不使用Tensorflow的情况下读取其内容?

目前,我可以编写一个示例读取器来转储我的.pb文件的事件,稍后由tensorboard读取,如下所示:

import tensorflow as tf
from tensorflow.python.platform import gfile
INCEPTION_LOG_DIR = '/tmp/inception_v3_log'
if not os.path.exists(INCEPTION_LOG_DIR):
os.makedirs(INCEPTION_LOG_DIR)
with tf.Session() as sess:
model_filename = './model/tensorflow_inception_v3_stripped_optimized_quantized.pb'
with gfile.FastGFile(model_filename, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
#writer = tf.train.SummaryWriter(INCEPTION_LOG_DIR, graph_def)
writer=tf.summary.FileWriter(INCEPTION_LOG_DIR, graph_def)                                                
writer.close()

但是,我不太明白我为什么编译protoc的原因? 它不能用作独立阅读器吗?或者,提到的inception.pb文件已经在Tensorflow的后端中使用了协议缓冲区,而无需使用protoc

像这样的命令确实会产生错误:

protoc --python_out=. tensorflow_inception_v3_stripped_optimized_quantized.pb
protoc --cpp_out=. tensorflow_inception_v3_stripped_optimized_quantized.pb

正如我检查的那样,.pb文件是半可读的,但是,我在任何地方都找不到我的问题的可靠答案来直接解析该文件的内容。我在这里错过了什么吗?谢谢。

是的,protoc也可以用来解码.pb文件。

protoc --decode_raw < my_input.pb

将输出文件的原始结构。 这不是很有用,因为(与XML或JSON相反(protobuf文件不包含那么多的结构信息(元素名称(,但被"外包"到.proto文件中。

如果您有正确的 .proto 文件(在本例中来自 tensorflow 存储库(,则可以使用-I path_to_tensorflow_checkout并指定正确的消息类型名称。 请注意,在 tensorflow .proto 文件中,所有类型都在 tensorflow 包中,因此您必须在类型名称前面添加前缀。 工作示例:

protoc --decode tensorflow.SavedModel tensorflow/core/protobuf/saved_model.proto < path_to_saved_model.pb

(在这种情况下,我从 tensorflow 存储库目录中运行命令,省略了-I/--proto_path

根据您的模型文件格式(SavedModel 或 GraphDef(,您可能需要使用tensorflow.GraphDef(例如,用于"冻结图形"(而不是tensorflow.SavedModel

最新更新