我训练了一个递归神经网络(LSTM),并保存了权重和元图。当我检索元数据以进行预测时,只要序列长度与训练期间的长度相同,一切都可以正常工作。

LSTM的优点之一是输入的序列长度可以变化(例如,如果输入是组成句子的字母,则句子的长度可以变化)。

从元图检索图时,如何更改输入的序列长度?

使用代码的更多细节:

在培训期间,我使用占位符xy来填充数据。为了进行预测,我检索了这些占位符,但无法更改其形状(从[None, previous_sequence_length=100, n_input]更改为[None, new_sequence_length=50, n_input])。

在文件model.py中,定义体系结构和占位符:

 self.x = tf.placeholder("float32", [None, self.n_steps, self.n_input], name='x_input')
 self.y = tf.placeholder("float32", [None, self.n_classes], name='y_labels')
 tf.add_to_collection('x', self.x)
 tf.add_to_collection('y', self.y)
 ...

 def build_model(self):
     #using the placeholder self.x to build the model
     ...
     tf.split(0, self.n_input, self.x) # split input for RNN cell
     ...


在文件prediction.py中,我检索了用于预测的元图:

with tf.Session() as sess:
    latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir=checkpoint_dir)
    new_saver = tf.train.import_meta_graph(latest_checkpoint + '.meta')
    new_saver.restore(sess, latest_checkpoint)
    x = tf.get_collection('x')[0]
    y = tf.get_collection('y')[0]
    ...
    sess.run(..., feed_dict={x: batch_x})


这是我得到的错误:

ValueError: Cannot feed value of shape (128, 50, 2) for Tensor u'placeholders/x_input:0', which has shape '(?, 100, 2)'


注意:当不使用元图而是从头开始重建模型并仅加载已保存的权重(而不是元图)时,我设法解决了此问题。

编辑:用self.n_steps替换None并用tf.split(0, self.n_input, self.x)修改tf.split(0, self.x.get_shape()[1], self.x)时,出现以下错误:TypeError: Expected int for argument 'num_split' not Dimension(None).

最佳答案

定义变量时,建议您将其编写如下

[None, None, n_input]

代替:
[None, new_sequence_length=50, n_input]

在我的情况下有效。希望对您有所帮助

09-27 09:01