我已成功导出重新训练的InceptionV3 NN作为TensorFlow元图。我已经成功地将这个protobuf读回到python中,但是我很难看到导出每个图层权重和偏差值的方法,我假设它存储在元图形protobuf中,用于在TensorFlow外部重新创建nn。
我的工作流程如下:
Retrain final layer for new categories
Export meta graph tf.train.export_meta_graph(filename='model.meta')
Build python pb2.py using Protoc and meta_graph.proto
Load Protobuf:
import meta_graph_pb2
saved = meta_graph_pb2.CollectionDef()
with open('model.meta', 'rb') as f:
saved.ParseFromString(f.read())
从这里我可以查看图表的大多数方面,比如节点名称等,但我认为我的经验不足,难以找到访问每个相关层的权重和偏差值的正确方法。
答案 0 :(得分:7)
MetaGraphDef
proto实际上并不包含权重和偏差的值。相反,它提供了一种方法,将GraphDef
与存储在一个或多个检查点文件中的权重相关联,由tf.train.Saver
编写。 MetaGraphDef
tutorial有更多细节,但近似结构如下:
在您的培训计划中,使用tf.train.Saver
写出检查点。这也会将MetaGraphDef
写入同一目录中的.meta
文件。
saver = tf.train.Saver(...)
# ...
saver.save(sess, "model")
您应该在检查点目录中找到名为model.meta
和model-NNNN
的文件(对于某些整数NNNN
)。
在另一个程序中,您可以导入刚创建的MetaGraphDef
,并从检查点恢复。
saver = tf.train.import_meta_graph("model.meta")
saver.restore("model-NNNN") # Or whatever checkpoint filename was written.
如果您想获取每个变量的值,您可以(例如)在tf.all_variables()
集合中找到变量并将其传递给sess.run()
以获取其值。例如,要打印所有变量的值,可以执行以下操作:
for var in tf.all_variables():
print var.name, sess.run(var)
您还可以过滤tf.all_variables()
以查找您尝试从模型中提取的特定权重和偏差。