使用Tensorflow seq2seq教程代码我正在创建一个基于字符的聊天机器人。我不使用文字嵌入。我有一系列字符(字母和一些标点符号)和特殊符号,如GO,EOS和UNK符号。
因为我没有使用字嵌入,所以我使用标准的tf.nn.seq2seq.basic_rnn_seq2seq()
seq2seq模型。但是,我对encoder_inputs
和decoder_inputs
应具有的形状感到困惑。它们应该是一个整数数组,对应于字母数组中字符的索引,还是应该先将这些整数转换成一个热矢量?
一个LSTM单元有多少个输入节点?你能说明一下吗?因为我想在我的情况下,LSTM单元应该为字母表中的每个字母都有一个输入神经元(因此是单热矢量?)。
另外,你必须在构造函数tf.nn.rnn_cell.BasicLSTMCell(size)
中传递LSTM“大小”是什么?
谢谢。
附录:这些是我想要解决的错误。
当我使用以下代码时,根据教程:
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.
答案 0 :(得分:0)
lstm单元格的输入数量是在实例化事物时作为tf.rnn
函数输入传递的张量的维数。
size
参数是你的lstm中隐藏单位的数量(所以较大的数字较慢但可以导致更准确的模型)。
我需要更大的堆栈跟踪才能理解这些错误。
答案 1 :(得分:0)
事实证明,传递给size
的{{1}}参数表示LSTM的隐藏状态的大小和输入层的大小。因此,如果您想要一个不同于输入大小的隐藏大小,您可以先通过其他投影图层传播您的输入,或使用内置的seq2seq字嵌入功能。