我想训练一个逐字符生成文本的神经网络。经过一些研究后,我决定使用LSTM网络完成这项任务。
我的输入结构如下: 我有一个文本(大约90,000,000个字符)的文件,我切成50个字符的重叠序列。考虑这个例句:
this.userInfo = this.afs.collection('collection', ref => ref.where('value',
'==', true).limit(1)).valueChanges().flatMap(result => result);
我将文本拆分为序列:
<p>{{ (userInfo | async)?.duration }}</p>
The quick brown fox jumps over the lazy dog
The quick brown
he quick brown_
e quick brown f
我添加了下划线,这些空格不会显示在这些......
中这些是我的输入数据的时间步长。输出将是每个序列之后的下一个字符,因此上面的序列为_quick brown fo
。
字符在一个向量中进行单热编码,其长度为字典中所有字符的长度,因此字母C由quick brown fox
组成,字符C将表示为_, f, o, x and _
因为我不能同时将所有文本都复制到内存中,所以我将其分解为仅包含少量生成序列的批次,以供网络训练。
我得到了我的输入占位符:
A B C D
在下面的示例代码中,我使用了[0 0 1 0]
的128,x = tf.placeholder(tf.float32, [batch_size, time_steps, char_size]
的50和batch_size
的48来表示标准字母表,其中包含大写和小写的50个字母。< / p>
传递给time_steps
的
char_size
也被任意选为256(在我的超参数之后的一些教程中)
以下是代码:
num_units
这是错误消息:
BasicLSTMCell
在过去的几天里,我一直在忽视这一点,我在这里错过了什么?
答案 0 :(得分:1)
在循环中初始化多个单元格,而不是使用[cell] * n
表示法:
cells = []
for _ in range(n):
cells.append(tf.contrib.rnn.BasicLSTMCell(num_units)) # build list of cells
cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True) # pass your list of cells
output, state = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
否则,它基本上是尝试多次使用同一个单元格,但维度不起作用。我相信,这个行为在1.0发布中已经改变了。您曾经能够使用原始语法;现在你必须使用它。