Tensorflow - 使用经过训练的 RNN 生成文本

Posted

技术标签:

【中文标题】Tensorflow - 使用经过训练的 RNN 生成文本【英文标题】:Tensorflow - Use Trained RNN to generate text 【发布时间】:2017-10-22 04:25:13 【问题描述】:

我正在尝试使用之前训练的 LSTM 生成文本。我找到了existing solution,但问题是它抛出了一些异常。据我了解,这是由于使用较旧的库而发生的。经过一些修复后,这是我用于文本生成的最终功能:

def generate_text(train_path, num_sentences, rnn_data):
gen_config = get_config()
gen_config.num_steps = 1
gen_config.batch_size = 1

with tf.Graph().as_default(), tf.Session() as session:
    initializer = tf.random_uniform_initializer(-gen_config.init_scale,
                                                gen_config.init_scale)

    with tf.name_scope("Generate"):
        rnn_input = PTBInput(config=gen_config, data=rnn_data, name="GenOut")
        with tf.variable_scope("OutModel", reuse=None, initializer=initializer):
            mout = PTBModel(is_training=False, config=gen_config, input_=rnn_input)

            # Restore variables from disk. TODO: save/load trained models
            # saver = tf.train.Saver()
            # saver.restore(session, model_path)
            # print("Model restored from file " + model_path)

        print('Getting Vocabulary')
        words = reader.get_vocab(train_path)

        mout.initial_state = tf.convert_to_tensor(mout.initial_state)

        state = mout.initial_state.eval()
        # state = session.run(mout.initial_state)
        x = 0  # the id for '<eos>' from the training set //TODO: fix this
        word_input = np.matrix([[x]])  # a 2D numpy matrix

        text = ""
        count = 0
        while count < num_sentences:
            output_probs, state = session.run([mout.output_probs, mout.final_state],
                                              mout.input.input_data: word_input,
                                               mout.initial_state: state)

            print('Output Probs = ' + str(output_probs[0]))
            x = sample(output_probs[0], 0.9)
            if words[x] == "<eos>":
                text += ".\n\n"
                count += 1
            else:
                text += " " + words[x]
            # now feed this new word as input into the next iteration
            word_input = np.matrix([[x]])
        print(text)
    return

但我得到一个例外:

FailedPreconditionError(参见上文的回溯):尝试使用未初始化的值 OutModel/softmax_b [[节点:OutModel/softmax_b/read = IdentityT=DT_FLOAT, _class=["loc:@OutModel/softmax_b"], _device="/job:localhost/replica:0/task:0/cpu:0"]]]

我该如何解决?我的代码还有其他问题吗?

【问题讨论】:

还有其他输出信息可以帮助我们吗? 我不确定还有什么可以帮助的......据我所知 - 当程序到达时会引发此异常:output_probs, state = session.run([mout.output_probs, mout.final_state], mout.input.input_data: word_input, mout.initial_state: state) 试试tf.global_variables_initializer()看看能不能解决问题 感觉这段代码解决了我的问题!谢谢! :) 你对这种文本生成方法有什么看法?我应该修理什么吗?是否正确? 【参考方案1】:

问题是一个未初始化的变量,您可以通过单独初始化所有变量或使用帮助程序 tf.global_variables_initializer() 来解决此问题

【讨论】:

以上是关于Tensorflow - 使用经过训练的 RNN 生成文本的主要内容,如果未能解决你的问题,请参考以下文章

使用 TensorFlow 进行端到端语音识别的 RNN

使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因

学习Tensorflow的LSTM的RNN例子

如何在 RNN TensorFlow 中使用非常大的数据集?

TensorFlow:如何使用 RNN 对二进制序列进行分类?

state_is_tuple=True 时如何设置 TensorFlow RNN 状态?