使用protoc

时间:2017-07-27 00:00:14

标签: tensorflow protocol-buffers

我从源代码编译了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的后端使用了Protocol buffer而不需要使用protoc

这样的命令会产生错误:

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

在我检查时,.pb文件是半可读的,但是,我无法在任何地方找到可靠的答案来直接解析此文件的内容。我在这里错过了什么吗?感谢。

1 个答案:

答案 0 :(得分:0)

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

protoc --decode_raw < my_input.pb

将输出文件的原始结构。这不是很有用,因为protobuf文件(与XML或JSON相反)不包含太多结构信息(元素名称),但已“外包”到.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。)

取决于您的model file format (SavedModel or GraphDef),您可能需要使用tensorflow.GraphDef(例如,用于“冻结图”)而不是tensorflow.SavedModel