Skip to main content
 首页 » 编程设计

python之如何在没有定义变量的情况下保存 tensorflow 模型(省略标签张量)

2024年08月19日26wuhuacong

我的tensorflow模型定义如下:

X =  tf.placeholder(tf.float32, [None,training_set.shape[1]],name = 'X') 
Y = tf.placeholder(tf.float32,[None,training_labels.shape[1]], name = 'Y') 
A1 = tf.contrib.layers.fully_connected(X, num_outputs = 50, activation_fn = tf.nn.relu) 
A1 = tf.nn.dropout(A1, 0.8) 
A2 = tf.contrib.layers.fully_connected(A1, num_outputs = 2, activation_fn = None) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = A2, labels = Y))     
global_step = tf.Variable(0, trainable=False) 
start_learning_rate = 0.001 
learning_rate = tf.train.exponential_decay(start_learning_rate, global_step, 200, 0.1, True ) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

现在我想保存这个省略张量 Y 的模型(Y 是用于训练的标签张量,X 是实际输入)。此外,在使用 freeze_graph.py 时提及输出节点时,我应该提及 “A2” 还是使用其他名称保存?

请您参考如下方法:

虽然您没有手动定义变量,但上面的代码片段实际上包含 15 个可保存的变量。您可以使用此内部 tensorflow 函数查看它们:

from tensorflow.python.ops.variables import _all_saveable_objects 
for obj in _all_saveable_objects(): 
  print(obj) 

对于上面的代码,它生成以下列表:

<tf.Variable 'fully_connected/weights:0' shape=(100, 50) dtype=float32_ref> 
<tf.Variable 'fully_connected/biases:0' shape=(50,) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/weights:0' shape=(50, 2) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/biases:0' shape=(2,) dtype=float32_ref> 
<tf.Variable 'Variable:0' shape=() dtype=int32_ref> 
<tf.Variable 'beta1_power:0' shape=() dtype=float32_ref> 
<tf.Variable 'beta2_power:0' shape=() dtype=float32_ref> 
<tf.Variable 'fully_connected/weights/Adam:0' shape=(100, 50) dtype=float32_ref> 
<tf.Variable 'fully_connected/weights/Adam_1:0' shape=(100, 50) dtype=float32_ref> 
<tf.Variable 'fully_connected/biases/Adam:0' shape=(50,) dtype=float32_ref> 
<tf.Variable 'fully_connected/biases/Adam_1:0' shape=(50,) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/weights/Adam:0' shape=(50, 2) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/weights/Adam_1:0' shape=(50, 2) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/biases/Adam:0' shape=(2,) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/biases/Adam_1:0' shape=(2,) dtype=float32_ref> 

fully_connected 层都有变量,还有一些来自 Adam 优化器(参见 this question)。请注意,此列表中没有 X 和 Y 占位符,因此无需排除它们。当然,这些张量存在于元图中,但它们没有任何值(value),因此无法保存。

如果未明确提供变量,_all_saveable_objects() 列表是 tensorflow saver 默认保存的内容。因此,您的主要问题的答案很简单:

saver = tf.train.Saver()  # all saveable objects! 
with tf.Session() as sess: 
  tf.global_variables_initializer().run() 
  saver.save(sess, "...") 

无法提供 tf.contrib.layers.fully_connected 的名称函数(因此,它被保存为 fully_connected_1/...),但我们鼓励您切换到 tf.layers.dense ,它有一个 name 参数。要了解为什么这是个好主意,请查看 this和 this discussion .