gpt4 book ai didi

python - 使用tensorflow构建seq2seq模型时出错

转载 作者:太空狗 更新时间:2023-10-29 17:19:39 25 4
gpt4 key购买 nike

我试图理解在 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]]

我怀疑错误来 self 这边:)在旁注中。文档和教程真的很棒,但是序列到序列模型的示例代码(英语到法语的翻译示例)非常密集。您还必须在文件之间跳转很多才能了解发生了什么。我至少在代码中迷路了好几次。

构建和训练基本 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))

最佳答案

大多数模型(seq2seq 也不异常(exception))期望它们的输入是批量的,所以如果你的逻辑输入的形状是[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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com