如何使用 Saver 在 Tensorflow 中保存和恢复经过 lstm 训练的模型?

How to save and restore a lstm trained model in Tensorflow using Saver?

我已经保存了一个经过训练的 LSTM 模型,我想恢复预测以便在测试中使用它。我试图关注 this post。但我收到错误。这是我尝试过的:

x = tf.placeholder('tf.float32', [None, input_vec_size, 1])
y = tf.placeholder('tf.float32')


def recurrent_neural_network(x):
    layer = {'weights': tf.Variable(tf.random_normal([n_hidden, n_classes])),
             'biases': tf.Variable(tf.random_normal([n_classes]))}     
    x = tf.transpose(x, [1, 0, 2])
    x = tf.reshape(x, [-1, 1])
    x = tf.split(x, input_vec_size, 0)

    lstm_cell = rnn.BasicLSTMCell(n_hidden, state_is_tuple=True)
    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)
    output = tf.add(tf.matmul(outputs[-1], layer['weights']), layer['biases'])

    return output

def train_neural_network(x):
    prediction = recurrent_neural_network(x)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
    saver = tf.train.Saver()

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        Training ...
        saver.save(sess, os.path.join(os.getcwd(), 'my_test_model'))

在那之后,在训练阶段我正在尝试

def test_neural_network(input_data):
    with tf.Session() as sess:
        #sess.run(tf.global_variables_initializer())
        new_saver = tf.train.import_meta_graph('my_test_model.meta')
        new_saver.restore(sess, tf.train.latest_checkpoint('./'))
        prediction = tf.get_default_graph().get_tensor_by_name("prediction:0")

        Calculate features from input_data ...
        result = sess.run(tf.argmax(prediction.eval(feed_dict={x: features}), 1))

但这会引发以下错误:

KeyError: "The name 'prediction:0' refers to a Tensor which does not exist. The operation, 'prediction', does not exist in the graph."

然后我尝试添加: 保存前 tf.add_to_collection('prediction', prediction) 恢复后替换为 prediction = tf.get_collection('prediction')[0]。但这给了我以下错误:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder_2' with dtype float and shape [?,34,1] [[Node: Placeholder_2 = Placeholderdtype=DT_FLOAT, shape=[?,34,1], _device="/job:localhost/replica:0/task:0/cpu:0"]]

我知道第一个错误,我应该指定一个名称以便恢复,但 prediction 不是 tensorflow 变量。我浏览了一些以前的帖子和文章,但无法提出可行的解决方案。所以,我的问题是:

  1. 我是不是在概念上做错了什么?如果是,是什么?
  2. 如果不是,是不是执行错误?我该如何解决?

谢谢。

我终于可以保存训练好的模型了,所以发布一个答案以防有人遇到这个问题。我没有得到确切问题的解决方案,但我可以使用 tflearn 构建和保存我的模型。为了训练和存储:

model = tflearn.DNN(lstm_model(n_classes, input_vec_size))
model.fit(train_x, train_y, validation_set=(test_x, test_y), n_epoch=20,
          show_metric=True, snapshot_epoch=True, run_id='lstm_model')
model.save("../Models/lstm_model")

稍后,要恢复:

model.load(filepath+"lstm_model")

这似乎是一种更容易使用模型的方法,并提供了一种紧凑而新颖的方法来完成我在问题中发布的相同任务。