在tensorflow中使用embedding_rnn_seq2seq

时间:2017-09-25 07:42:43

标签: python tensorflow lstm rnn

official documentation中显示的文档似乎直接进入了注意力模型而没有展示如何使用基本的seq2seq模型。我试图将某种日期格式转换为一种标准方法。一些例子如下所示:

[('7 07 13', '2013-07-07'),
 ('30 JULY 1977', '1977-07-30'),
 ('Tuesday, September 14, 1971', '1971-09-14'),
 ('18 09 88', '1988-09-18'),
 ('31, Aug 1986', '1986-08-31')]

其中第二列是输出'y'。

以下是我计划在高级别使用seq2seq模型的方法:

  1. 将输出和输入字符嵌入10维向量中。
  2. 填充输入向量,使它们都是固定长度(在我的情况下为29,输出长度为11)。
  3. 将这29个字符传递给seq2seq,以便输出11个大小为hidden_size的对数
  4. 使用平均交叉熵损失(跨时间步长和批量大小)来获得损失值。
  5. 优化此损失。
  6. 我到目前为止的模型如下:

    import tensorflow.contrib.legacy_seq2seq as seq2seq
    
    enc_inp = [tf.placeholder(tf.int32, shape=(None,)) for t in range(x_seq_length)]
    labels = [tf.placeholder(tf.int32, shape=(None,)) for t in range(y_seq_length)]
    is_train  = tf.placeholder(tf.bool)
    weights = [tf.ones_like(labels_t, dtype=tf.float32) for labels_t in labels]
    
    memory_dim = 32
    embed_dim = 32
    cell = tf.contrib.rnn.BasicLSTMCell(memory_dim)
    dec_outputs, dec_memory = seq2seq.embedding_rnn_seq2seq(enc_inp, dec_inp, cell, 
                                                            len(char2numX), len(char2numY), 
                                                            embed_dim,
                                                            feed_previous = tf.logical_not(is_train))
    
    loss = seq2seq.sequence_loss(dec_outputs, labels, weights)
    

    然而,它抱怨Lengths of logits, weights, and targets must be the same 29, 11, 11,因为(我认为)dec_outputs长度为29,而我希望它的长度为11。

    1. 我的问题是,我正在从长度为29的序列转换为长度为11的序列,我应该如何在tensorflow中执行此操作。
    2. 如果我错了,还要纠正我,这些模型的输入大小为[time_steps, batch_size]?请注意batch_size是第二个参数,而不是第一个参数。通过我阅读的一些教程得到了这种印象。
    3. 提供包含数据的完整代码here

0 个答案:

没有答案