假设您有一个训练有素的网络,该网络由五个层组成,表示为 L1-> L2-> L3-> L4-> L5 。 这里,L1是输入层,由tf.placeholder组成。
如何将中间层(如L3)的输出修复到用户指定的值并运行正向传递以查看L5的输出值?换句话说,在这种情况下,我们希望将L3视为起始输入层,并完全忽略L1和L2。
最后,假设后向传递需要 no :即,我们只想评估而不是进一步训练模型。
谢谢!
答案 0 :(得分:3)
我们需要将L1和L2用作身份运算并将输入直接传递给L3。
我们需要使用检查点加载模型。
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)
让我们说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