我正在尝试理解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模型方面,提供一个最小化的示例(可能是一些玩具数据)将非常有帮助。是否已经在某个地方存在这样的示例?
编辑 我已经根据@Ishamael的建议修复了上面的代码(意思是没有错误返回)(见下文),但在这个修复版中仍然有些不清楚的东西。我的输入是长度为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))