TensorFlow LSTM 生成模型

5

我正在使用LSTM语言模型教程(在此处讨论)进行工作。

在语言模型中,通常在训练后使用模型从头生成新句子(即从模型中抽样)。

我是TensorFlow的新手,但我尝试使用已经训练好的模型生成新的单词,直到遇到句子结尾标记。

我的初始尝试:

x = tf.zeros_like(m.input_data)
state = m.initial_state.eval()
for step in xrange(m.num_steps):
    state = session.run(m.final_state,
                               {m.input_data: x,
                                m.initial_state: state})
    x = state

出现错误:

ValueError: 使用序列设置数组元素。

1个回答

8
这里的问题似乎是在session.run()中传递的feed_dictm.input_data: x的映射。在这种情况下,TensorFlow期望x是一个numpy数组(或某些可以被隐式转换为numpy数组的对象),但实际上该值是TensorFlow Tensor(即tf.zeros_like()的结果)。

幸运的是,解决方案很简单。请将x = tf.zeros_like(m.input_data)替换为以下内容:

x = tf.zeros_like(m.input_data).eval()

该方法确保将x转换为numpy数组。

(请注意,更直接的方法是构造具有适当尺寸的numpy数组作为初始x。)


谢谢!那让我很有感觉。 - Shazam
遇到了不同的错误:W tensorflow/core/common_runtime/executor.cc:1076] 0x7fcc3575bc70 计算状态:无效参数:您必须为占位符张量'model_1/Placeholder_2'提供一个dtype为int32且形状为dim {size: 1} dim {size: 1}的值。 - Shazam
看起来你缺少了一个 feed。我不是100%确定,但 m.targets 也可能有依赖关系,如果是这样,你可能需要稍微重构一下代码(或者为 m.targets 提供一个虚拟值)。 - mrry
再次感谢。m.targets是一个占位符。尝试运行:target = session.run(m.targets,{m.input_data: x,m.targets: targets,m.initial_state: state})时出现错误:Invalid argument: model_1/Placeholder_3:0既被提供又被获取。我意识到在这一点上,我需要重构模型,以不再将目标作为占位符。 - Shazam
没事了。目标是正确的标签,final_state 将是预测的标签。 - Shazam
@Shazam 我也在尝试使用RNN教程来首先训练网络,然后在训练完成后直接运行它。我尝试了你的代码(使用了这个答案的修复),但是得到了与你在这里第二条评论中相同的错误。你是如何解决这个错误的?现在我认为我需要改变模型,以便不依赖于馈送“目标”占位符,你是如何做到这一点的?你只是将其更改为具有相同维度的tf.Variable吗?感谢您的所有帮助! - Jacob Hagstedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接