【问题标题】:predict new data by pre-trained model in tensor-flow通过张量流中的预训练模型预测新数据
【发布时间】:2023-11-03 05:47:01
【问题描述】:

我在张量流中训练了一个 LSTM 模型,我想根据它预测新数据。但是,我不断收到一个我无法理解的错误:

这是模型:

def __init__(self , snapshot_dir, save_dir ):
    self.save_dir = save_dir
    self.snapshot_dir =  snapshot_dir
    self.learning_rate = params["learning_rate"]
    self.training_steps = params["training_steps"]
    self.batch_size = params["batch_size"]
    self.display_step = params["display_step"]
    self.num_input = params["num_input"]  
    self.timesteps = params["timesteps"]  
    self.num_hidden = params["num_hidden"]  
    self.num_classes = params["num_classes"] 
    self.define_graph()

def define_graph(self):

    self.X = tf.placeholder("float", [None, self.timesteps, self.num_input], name="X")
    self.Y = tf.placeholder("float", [None, self.num_classes], name="Y")
    self.weights = {'out': tf.Variable(tf.random_normal([self.num_hidden, self.num_classes]))}
    self.biases = {'out': tf.Variable(tf.random_normal([self.num_classes]))}

def RNN(self):

    x = tf.unstack(self.X, self.timesteps, 1)
    lstm_cell = rnn.BasicLSTMCell(self.num_hidden, forget_bias=1.0, reuse=tf.get_variable_scope().reuse)
    outputs, states = rnn.static_rnn(lstm_cell, x , dtype=tf.float32)
    return tf.matmul(outputs[-1], self.weights['out']) + self.biases['out']

def run(self, X_train, y_train):

    logits = self.RNN()
    self.prediction = tf.nn.softmax(logits, name="prediction")
    loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
        logits=logits, labels=self.Y))
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.learning_rate)
    train_op = optimizer.minimize(loss_op)
    correct_pred = tf.equal(tf.argmax(self.prediction, 1), tf.argmax(self.Y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    init = tf.global_variables_initializer()
    with tf.Session() as sess:

        sess.run(init)
        saver = tf.train.Saver()
        for step in range(1, self.training_steps + 1):
            start_idx = random.randint(0, len(X_train) - self.timesteps - 1)
            batch_x = self.generate_x_batch_data(start_idx, X_train, self.batch_size)
            batch_y = self.generate_y_batch_data(start_idx, y_train, self.batch_size)

            sess.run(train_op, feed_dict={self.X: batch_x, self.Y: batch_y})
        saver.save(sess, self.save_dir, global_step=step)

还有预测部分:

    sess = tf.Session()
    saver = tf.train.import_meta_graph("{}.meta".format(self.newest_snapshot))
    saver.restore(sess, self.newest_snapshot)
    X_as_batch = self.aux.generate_x_batch_data(0,X, len(X))
    pred = tf.get_default_graph().get_operation_by_name("prediction").outputs[0]
    feed_dict = {tf.get_default_graph().get_operation_by_name('X').outputs[0]: X_as_batch}
    prediction = sess.run(pred,
                          feed_dict=feed_dict)

X_as_batch 的形状与pred 预期的一样(它的形状是[5126, 60, 39]pred 的形状是[?, 60, 39]

但我得到了错误

InvalidArgumentError(参见上面的回溯):您必须输入一个值 对于具有 dtype 浮点数和形状 [?,1024]
的占位符张量“X_1” [[节点:X_1 = Placeholderdtype=DT_FLOAT, shape=[?,1024], _device="/job:localhost/replica:0/task:0/cpu:0"]]

可能是什么原因?

【问题讨论】:

  • 向我们展示您的模型
  • @Maxim 在原帖中添加
  • 占位符仍然丢失。试试graph.get_tensor_by_name("X:0")graph.get_tensor_by_name("prediction:2")
  • @Maxim 抱歉,已添加
  • 这里让我感到困惑的是,错误消息是关于X_1,而不是X。这暗示在某处还有一个X

标签: python tensorflow machine-learning deep-learning prediction


【解决方案1】:

你有一个X_1 张量的原因是你已经恢复了一个图,而你的旧图仍然存在。为了避免两个 TensorFlow 变量都被称为 X,新变量会附加一个 _1

我不能确定,因为您没有包含所有代码,但如果您在一次执行中完成所有工作,您可能不需要恢复任何内容。或者,您可能只需要恢复saver 创建的检查点文件,使用类似saver.restore(sess, './model.ckpt') 的内容,将'./model.ckpt' 替换为ckpt 文件的路径。

【讨论】: