我试图理解TensorFlow中seq2seq.py中定义的seq2seq模型。我使用TensorFlow附带的translate.py示例中复制的代码位。我不断地犯同样的错误,真的不明白它是从哪里来的。
再现错误的最小代码示例:

import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
from tensorflow.models.rnn import seq2seq

encoder_inputs = []
decoder_inputs = []
for i in xrange(350):
    encoder_inputs.append(tf.placeholder(tf.int32, shape=[None],
                                              name="encoder{0}".format(i)))

for i in xrange(45):
    decoder_inputs.append(tf.placeholder(tf.int32, shape=[None],
                                         name="decoder{0}".format(i)))

model = seq2seq.basic_rnn_seq2seq(encoder_inputs,
                                  decoder_inputs,rnn_cell.BasicLSTMCell(512))

计算最后一行时得到的错误(我在python解释器中以交互方式计算它):
    >>>  Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/tmp/py1053173el", line 12, in <module>
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/seq2seq.py", line 82, in basic_rnn_seq2seq
        _, enc_states = rnn.rnn(cell, encoder_inputs, dtype=dtype)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/rnn.py", line 85, in rnn
        output_state = cell(input_, state)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/rnn_cell.py", line 161, in __call__
        concat = linear.linear([inputs, h], 4 * self._num_units, True)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/linear.py", line 32, in linear
        raise ValueError("Linear is expecting 2D arguments: %s" % str(shapes))
    ValueError: Linear is expecting 2D arguments: [[None], [None, 512]]

我怀疑错误来自我这方面。)
旁注。文档和教程都非常好,但是序列到序列模型(英语到法语的翻译示例)的示例代码非常密集。你还需要在文件之间跳很多步来理解发生了什么。我至少在密码里丢了好几次。
一个构建和训练一个基本的seq2seq模型的最小示例(可能在一些玩具数据上)在这里真的很有帮助。有人知道这是否已经存在?
编辑
我已经根据@ishamel建议修复了上面的代码(意思是,没有返回错误)(请参阅下面),但是在这个修复版本中仍然有一些事情不清楚。我的输入是实值长度为2的向量序列。我的输出是一个长度为22的二进制向量序列。我的tf.placeholder代码应该不是如下所示吗?(编辑是)
tf.placeholder(tf.float32, shape=[None,2],name="encoder{0}".format(i))
tf.placeholder(tf.float32, shape=[None,22],name="encoder{0}".format(i))

我还必须把上面的tf.int32改成tf.float32。因为我的输出是二进制的。我的解码器的tf.placeholder应该不是tf.int32吗?但如果我这样做,TensorFlow又会抱怨。我不知道这背后的原因是什么。
我隐藏层的大小是512。
完整的固定代码
import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
from tensorflow.models.rnn import seq2seq

encoder_inputs = []
decoder_inputs = []
for i in xrange(350):
    encoder_inputs.append(tf.placeholder(tf.float32, shape=[None,512],
                                          name="encoder{0}".format(i)))

for i in xrange(45):
    decoder_inputs.append(tf.placeholder(tf.float32, shape=[None,512],
                                         name="decoder{0}".format(i)))

model = seq2seq.basic_rnn_seq2seq(encoder_inputs,
                                  decoder_inputs,rnn_cell.BasicLSTMCell(512))

最佳答案

大多数模型(seq2seq不是例外)都希望它们的输入是批量的,因此如果逻辑输入的形状是[n],那么将用作模型输入的张量的形状应该是[batch_size x n]。在实践中,形状的第一个维度通常被省略为None并推断为运行时的批大小。
由于seq2seq的逻辑输入是数字的矢量,因此实际张量形状应为[None, input_sequence_length]。因此,固定代码将沿着以下几行:

input_sequence_length = 2; # the length of one vector in your input sequence

for i in xrange(350):
    encoder_inputs.append(tf.placeholder(tf.int32, shape=[None, input_sequence_length],
                                              name="encoder{0}".format(i)))

(对解码器也是如此)

关于python - 使用tensorflow构建seq2seq模型时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33762831/

10-12 18:04