张量流量:简单网络手术(丢弃第一层)

时间:2017-02-22 02:21:49

标签: tensorflow

假设您有一个训练有素的网络,该网络由五个层组成,表示为 L1-> L2-> L3-> L4-> L5 。 这里,L1是输入层,由tf.placeholder组成。

如何将中间层(如L3)的输出修复到用户指定的值并运行正向传递以查看L5的输出值?换句话说,在这种情况下,我们希望将L3视为起始输入层,并完全忽略L1和L2。

最后,假设后向传递需要 no :即,我们只想评估而不是进一步训练模型。

谢谢!

1 个答案:

答案 0 :(得分:3)

我们需要将L1和L2用作身份运算并将输入直接传递给L3。

  1. 我们需要使用检查点加载模型。

     graph = tf.Graph()
     with graph.as_default():
        saver = tf.train.import_meta_graph(checkpoint_path + '.meta')
        session = tf.Session(graph=graph)
        saver.restore(session, checkpoint_path)
    
  2. 让我们说L1和L2中的操作的名称分别是'l1'和'l2'。我们需要获取节点并将op更改为L1和L2的标识,并更改L3的标识。

          graph_def = graph.as_graph_def()
          for node in graph_def.node:
              if node.name == "L3":
              # Change its input from the output of L2 to the original input tensor op name.
                  node.input[1] = "input"
              if node.name == "L1" or node.name == "L2":
                  # For L1 and L2, change its op to Identity
                  node.op = "Identity"
    

    有关详细说明,请参见 https://github.com/TheMoskowitz/tensorflow-surgery/blob/master/Tensorflow_Surgery.ipynb