将特定的TensorFlow变量还原到特定层(按名称还原)

man*_*ate 5 python deep-learning tensorflow

假设我训练了一个TensorFlow模型并保存了它,现在有一个不同的模型,并且我想对模型中的某些层(它们具有相同的形状)使用保存的模型中的某些权重。

现在,我能够找到如何从模型(具有特定名称)中保存特定变量的方法,但是却找不到用于按名称还原这些变量的任何示例。

例如,假设在保存的模型中,我保存了称为“ v1”的权重张量(具有某种形状)。现在在我的新模型中,我有一个权重张量称为“ v2”(其形状与“ v1”张量相同)。现在,我想将已保存的变量“ v1”加载到我的“ v2”权重张量,甚至更好地将此“ v1”权重加载到我的新图中的多个张量。

那有可能吗?如果是这样,我该怎么办?

man*_*ate 3

我找到了解决此问题的解决方法。

您可以做的是将变量值直接保存到磁盘中,无论是作为值还是作为字典,其中键作为张量名称和值。例如:

vars_dict = {}
for tensor in (list_of_tensors_you_want_to_save):
     vars_dict[tensor.name] = sess.run(tensor)
Run Code Online (Sandbox Code Playgroud)

然后您可以将任何变量从该字典加载到您想要的任何其他变量。

在我的示例中,假设原始张量称为“v1”,我要加载的两个张量是“v2”和“v3”,可以执行以下操作:

tensor_to_load_1 = tf.get_default_graph().get_tensor_by_name("v2")
tensor_to_load_2 = tf.get_default_graph().get_tensor_by_name("v3")

assign_op_1 = tf.assign(tensor_to_load_1, vars_dict["v1"])
assign_op_1 = tf.assign(tensor_to_load_2, vars_dict["v1"])

sess.run([assign_op_1, assign_op_2])
Run Code Online (Sandbox Code Playgroud)

当然,这仅受限于“v1”、“v2”和“v3”必须具有相同的形状。

使用此示例代码,您可以保存任何变量并将它们加载到您想要的任何其他变量,而不需要原始图表与当前图表相匹配。