我试图了解张量流中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))
答案 0 :(得分:8)
大多数模型(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)))
(然后解码器也一样)
答案 1 :(得分:1)
翻译模块中有一个自我测试方法,显示其最小用量。[here]
我刚使用。
运行自检方法 dn: dc=my-domain,dc=com
dc: my-domain
objectClass: top
objectClass: domain