我从源代码编译了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
文件是半可读的,但是,我无法在任何地方找到可靠的答案来直接解析此文件的内容。我在这里错过了什么吗?感谢。
答案 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
。