Python 训练元图的权重和偏差

Python 训练元图的权重和偏差,python,tensorflow,protocol-buffers,protoc,Python,Tensorflow,Protocol Buffers,Protoc,我已经成功地将重新训练的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

我已经成功地将重新训练的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())

从这里,我可以查看图形的大部分方面,如节点名称等,但我认为我的经验不足使得很难找到访问每个相关层的权重和偏差值的正确方法。

MetaGraphDef原型实际上并不包含权重和偏差值。相反,它提供了一种将
GraphDef
与存储在一个或多个检查点文件中的权重相关联的方法,该文件由。图中有更多细节,但大致结构如下:

  • 在您的培训计划中,使用
    tf.train.Saver
    写出一个检查点。这也会将
    MetaGraphDef
    写入同一目录中的
    .meta
    文件

    saver = tf.train.Saver(...)
    # ...
    saver.save(sess, "model")
    
    您应该在检查点目录中找到名为
    model.meta
    model NNNN
    (对于某些整数
    NNNN
    )的文件

  • saver = tf.train.Saver(...)
    # ...
    saver.save(sess, "model")
    
  • 在另一个程序中,您可以导入刚刚创建的
    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()
    ,以找到您试图从模型中提取的特定权重和偏差


  • 谢谢,这是一个巨大的帮助。我正试图重建一个训练有素的网络,并像这样部署它。根据您的专业知识,这是建立网络参数的正确方法吗(每个层的权重和偏差的二进制.dat文件作为浮动数组)?最终目标将是一个TensorFlow训练网络,在金属上进行推理。嗯,这取决于网络的复杂程度。您可以直接进入检查点(例如,使用
    tf.train.NewCheckpointReader()
    ),绕过
    MetaGraphDef
    ,从检查点文件中读取NumPy数组。事实上,即使你能将它链接到iOS程序中,你甚至可以使用iCudio> C++中的C++实现。(虽然我不知道链接会有多困难)。<代码> TF.Cuth.NealCuffoPosiTrad()/Cuth>是一个很棒的API。我加载了一个inception_v3检查点,希望重新创建存储在前面提到的dat文件中的数组。对于我来说,他们是如何产生网络参数的。它们加载190个文件(每个节点1个偏差,1个权重文件)作为网络参数,而TF为初始模型存储了1200多个变量。有什么可以弥补差距的建议吗?