LSTM seq2seq网络的输入-Tensorflow

Input of LSTM seq2seq network - Tensorflow

我正在使用 Tensorflow seq2seq 教程代码创建一个基于字符的聊天机器人。我不使用词嵌入。我有一组字符(字母表和一些标点符号)和特殊符号,如 GO、EOS 和 UNK 符号。

因为我没有使用词嵌入,所以我使用标准 tf.nn.seq2seq.basic_rnn_seq2seq() seq2seq 模型。但是,我对 encoder_inputsdecoder_inputs 应该有什么形状感到困惑。它们应该是一个整数数组,对应于字母数组中字符的索引,还是应该先将这些整数转换为单热向量?

一个 LSTM 单元有多少个输入节点?你能具体说明吗?因为我想在我的例子中,LSTM 单元应该为字母表中的每个字母都有一个输入神经元(因此是单热向量?)。 另外,你必须在构造函数中传递的 LSTM "size" 是什么 tf.nn.rnn_cell.BasicLSTMCell(size)?

谢谢。

附录:这些是我正在尝试修复的错误。

当我使用下面的代码时,根据教程:

for i in xrange(buckets[-1][0]):  # Last bucket is the biggest one.
    self.encoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="encoder{0}".format(i)))
for i in xrange(buckets[-1][1] + 1):
    self.decoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="decoder{0}".format(i)))
    self.target_weights.append(tf.placeholder(dtype, shape=[None], name="weight{0}".format(i)))

和 运行 self_test() 函数,我得到错误: ValueError: Linear is expecting 2D arguments: [[None], [None, 32]]

然后,当我将上面代码中的形状更改为 shape=[None, 32] 时,我得到了这个错误: TypeError: Expected int32, got -0.21650635094610965 of type 'float' instead.

lstm 单元的输入数量是实例化事物时作为输入传递给 tf.rnn 函数的任何张量的维数。

size 参数是 lstm 中隐藏单元的数量(因此数字越大速度越慢,但可以得到更准确的模型)。

我需要更大的堆栈跟踪才能理解这些错误。

事实证明,传递给 BasicLSTMCellsize 参数表示 LSTM 隐藏状态的大小和输入层的大小。因此,如果你想要一个不同于输入大小的隐藏大小,你可以先通过一个额外的投影层传播你的输入,或者使用内置的 seq2seq 词嵌入函数。