如何在tensorflow中恢复占位符?

问题描述 投票:1回答:1

我在tensorflow中保存了一个模型,我想将其恢复以供进一步使用,但是我收到了一个错误。代码在某种程度上如下:

import tensorflow as tf
def input_func(dim):
    input_ = tf.placeholder(tf.float32,[1,dim])
    return input_
def fully_connect(input_,out_dimension):
    out=tf.layers.dense(input_, out_dimension,\
        kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False))
    return tf.reduce_sum(out)
def train(real_input, input_dim, out_dimension):
    input_ = input_func(input_dim)
    output = fully_connect(input_, out_dimension)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for epoch in range(10):
            sess.run(output, {input_:real_input})

        tf.add_to_collection('input_',input_)
        tf.add_to_collection('output',output)
        tf.train.Saver().save(sess,'./save/expression') 
dim=3
out_dimension=2
real_input=[[1,2,3]]
with tf.Graph().as_default():
    train(real_input, dim, out_dimension)

现在建立并保存模型。

稍后恢复模型我使用了以下代码:

with tf.Session() as sess:
    loader = tf.train.import_meta_graph('./save/expression.ckpt.meta')
    loader.restore(sess, './save/expression.ckpt')
    input_=tf.get_collection('input_')
    print(input_)
    output=tf.get_collection('output')
    print(sess.run(output, {input_:[[4,5,6]]}))

但我遇到一个错误:

INFO:tensorflow:Restoring parameters from ./save/expression.ckpt
[]

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-98-6cfbdc96438e> in <module>()
      5     print(input_)
      6     output=tf.get_collection('output')
----> 7     print(sess.run(output, {input_:[[4,5,6]]}))

TypeError: unhashable type: 'list'

看来占位符input_没有保存!

任何人都可以帮我这个吗?

python tensorflow
1个回答
3
投票

您必须恢复占位符并为其提供适当的值。理想情况下,您应该在创建占位符时为其命名。由于您尚未命名,因此必须从图表中找到该名称。恢复模型后,打印出图表中节点的名称,将首先打印占位符。你可以这样做

with tf.Session() as sess:
    loader = tf.train.import_meta_graph('./save/expression.ckpt.meta')
    loader.restore(sess, './save/expression.ckpt')
    graph = tf.get_default_graph()
    for op in graph.get_operations():
        print(op.name)

我猜输入占位符将被赋予默认名称“占位符”。找到其名称后,您必须恢复该张量并为其提供值。如果名称是Placeholder,您可以使用

graph.get_tensor_by_name('Placeholder:0')

您应该以相同的方式找到输出节点的名称。它应该像fully_connected_1/matmul...,让我们假设名称是outputNodeName。然后你可以运行你的图表

with tf.Session() as sess:
    loader = tf.train.import_meta_graph('./save/expression.ckpt.meta')
    loader.restore(sess, './save/expression.ckpt')
    graph = tf.get_default_graph()
    input_= graph.get_tensor_by_name('Placeholder:0')
    output=tf.get_collection('outputNodeName:0')
    print(sess.run(output, {input_:[[4,5,6]]}))
© www.soinside.com 2019 - 2024. All rights reserved.