如何在没有嵌入的情况下使用 tensorflow seq2seq?

Posted

技术标签:

【中文标题】如何在没有嵌入的情况下使用 tensorflow seq2seq?【英文标题】:How to use tensorflow seq2seq without embeddings? 【发布时间】:2018-08-14 12:33:31 【问题描述】:

我一直在使用 tensorflow 在 LSTM 上进行时间序列预测。现在,我想尝试序列到序列(seq2seq)。在官方网站上有一个教程展示了 NMT with embeddings 。那么,如何在没有嵌入的情况下使用这个新的 seq2seq 模块呢? (直接使用时间序列“序列”)。

# 1. Encoder
encoder_cell = tf.contrib.rnn.BasicLSTMCell(LSTM_SIZE)
encoder_outputs, encoder_state = tf.nn.static_rnn(
  encoder_cell,
  x,
  dtype=tf.float32)

# Decoder
decoder_cell = tf.nn.rnn_cell.BasicLSTMCell(LSTM_SIZE)


helper = tf.contrib.seq2seq.TrainingHelper(
    decoder_emb_inp, decoder_lengths, time_major=True)


decoder = tf.contrib.seq2seq.BasicDecoder(
  decoder_cell, helper, encoder_state)

# Dynamic decoding
outputs, _ = tf.contrib.seq2seq.dynamic_decode(decoder)
outputs = outputs[-1]

# output is result of linear activation of last layer of RNN
weight = tf.Variable(tf.random_normal([LSTM_SIZE, N_OUTPUTS]))
bias = tf.Variable(tf.random_normal([N_OUTPUTS]))
predictions = tf.matmul(outputs, weight) + bias

如果我使用 input_seq=x 和 output_seq=label,TrainingHelper() 的参数应该是什么?

decoder_emb_inp ??? 解码器长度???

其中 input_seq 是序列的前 8 个点,而 output_seq 是序列的最后 2 个点。 提前致谢!

【问题讨论】:

你有没有找到答案?我正在遵循相同的教程并希望为时间序列数据实现它 嗨 MrfksIV!我刚刚找到本教程link,但它不使用不允许使用 ML Engine 的 TensorFlow API(可扩展的训练/在 GCP 上部署)。我希望本教程可以帮助您弄清楚如何为时间序列构建 seq2seq。如果您知道如何扩展到 TensorFlow API,请告诉我。 明天会看看这个,如果我找到任何东西,请告诉你。谢谢! 我找到了this,它帮助我构建了我想要的东西。我想它也能解决你的问题! 你取得好成绩了吗?我的意思是,与仅使用 LSTM 架构相比,它的性能更好。让我知道您是否获得了良好的结果以便对我的用例进行编码。 【参考方案1】:

我使用非常基本的InferenceHelper 使其无需嵌入即可工作:

inference_helper = tf.contrib.seq2seq.InferenceHelper(
        sample_fn=lambda outputs: outputs,
        sample_shape=[dim],
        sample_dtype=dtypes.float32,
        start_inputs=start_tokens,
        end_fn=lambda sample_ids: False)

我的输入是形状为[batch_size, time, dim] 的浮点数。对于下面的示例dim 将是 1,但这可以很容易地扩展到更多维度。这是代码的相关部分:

projection_layer = tf.layers.Dense(
    units=1,  # = dim
    kernel_initializer=tf.truncated_normal_initializer(
        mean=0.0, stddev=0.1))

# Training Decoder
training_decoder_output = None
with tf.variable_scope("decode"):
    # output_data doesn't exist during prediction phase.
    if output_data is not None:
        # Prepend the "go" token
        go_tokens = tf.constant(go_token, shape=[batch_size, 1, 1])
        dec_input = tf.concat([go_tokens, target_data], axis=1)

        # Helper for the training process.
        training_helper = tf.contrib.seq2seq.TrainingHelper(
            inputs=dec_input,
            sequence_length=[output_size] * batch_size)

        # Basic decoder
        training_decoder = tf.contrib.seq2seq.BasicDecoder(
            dec_cell, training_helper, enc_state, projection_layer)

        # Perform dynamic decoding using the decoder
        training_decoder_output = tf.contrib.seq2seq.dynamic_decode(
            training_decoder, impute_finished=True,
            maximum_iterations=output_size)[0]

# Inference Decoder
# Reuses the same parameters trained by the training process.
with tf.variable_scope("decode", reuse=tf.AUTO_REUSE):
    start_tokens = tf.constant(
        go_token, shape=[batch_size, 1])

    # The sample_ids are the actual output in this case (not dealing with any logits here).
    # My end_fn is always False because I'm working with a generator that will stop giving 
    # more data. You may extend the end_fn as you wish. E.g. you can append end_tokens 
    # and make end_fn be true when the sample_id is the end token.
    inference_helper = tf.contrib.seq2seq.InferenceHelper(
        sample_fn=lambda outputs: outputs,
        sample_shape=[1],  # again because dim=1
        sample_dtype=dtypes.float32,
        start_inputs=start_tokens,
        end_fn=lambda sample_ids: False)

    # Basic decoder
    inference_decoder = tf.contrib.seq2seq.BasicDecoder(dec_cell,
                                                        inference_helper,
                                                        enc_state,
                                                        projection_layer)

    # Perform dynamic decoding using the decoder
    inference_decoder_output = tf.contrib.seq2seq.dynamic_decode(
        inference_decoder, impute_finished=True,
        maximum_iterations=output_size)[0]

看看this question。我还发现这个tutorial 对于理解 seq2seq 模型非常有用,尽管它确实使用了嵌入。因此,将他们的GreedyEmbeddingHelper 替换为InferenceHelper,就像我在上面发布的那样。

附:我将完整代码发布在https://github.com/Andreea-G/tensorflow_examples

【讨论】:

以上是关于如何在没有嵌入的情况下使用 tensorflow seq2seq?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow 中为未知单词添加新的嵌入(训练和预设测试)

如何在Tensorflow中添加未知单词的新嵌入(训练和预设测试)

如何使用Tensorflow获得数组的所有元素与同一数组中的所有其他元素的余弦相似度

如何在没有嵌入式订阅的情况下执行一个又一个异步操作

如何在没有 Youtube 或 Vimeo 的情况下嵌入视频?

如何在没有javascript的情况下将PDF嵌入网页[重复]