【问题标题】:How to save a tensorflow model (omitting the labels tensor) with no variables defined如何保存未定义变量的张量流模型(省略标签张量)
【发布时间】:2017-12-18 08:26:13
【问题描述】:

我的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)

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

【问题讨论】:

    标签: python machine-learning tensorflow neural-network deep-learning


    【解决方案1】:

    虽然没有手动定义变量,但上面的代码 sn-p 实际上包含了 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)。请注意,此列表中没有 XY 占位符,因此无需排除它们。当然,这些张量存在于元图中,但它们没有任何价值,因此不可保存。

    _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 参数。要了解为什么这是个好主意,请查看 thisthis discussion

    【讨论】:

    • 感谢@Maxim 的回复。非常感谢您的时间。
    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多