我正在尝试使用语音音译数据训练元素研究RNN模块中的LSTM模型。我将训练数据作为X和Y的单独表格.X和Y都包含每个训练示例作为张量,即X中的张量包含序列中每个字符的ASCII值,Y中的张量包含结果序列的ASCII值。我已经以一种形式创建了数据,对于X和Y的特定示例,它完美地排列并用零填充进行训练。所以,我可以一次用一个例子训练LSTM。但是,问题是,我不知道如何进行批量训练,因为每个示例张量都有不同的长度。
我想,我可以通过这种表述来说清楚:
X{ Y{
[EEEEE00000] [00000MMMMM]
[EEE0000] [000MMMM]
[EEEEEEEE0000000000] [00000000MMMMMMMMMM]
. .
. .
. .
} }
其中,EEEE ..表示输入序列,MMMM ...表示输出序列..
我还没有设计模型,因为我正在思考一个能够支持批量训练的合适模型。我是想修改数据还是应该以修改数据的方式设计模型?如果它的模型,我怎么能这样做?
脚注:此LSTM必须在每个训练示例后忘记先前的序列。因为每个例子都是独立的。即,backprop只能用于 a_single_example_length 时间步。
答案 0 :(得分:0)
您有一个可变长度序列的数据集,并且您想要进行批处理。解决方案是将您的X和Y组织为seqlen x batchsize
张量,其中每个独立序列由零(或零的张量)分隔:
0 0
1 2
1 2
2 3
0 0
2 3
2 3
1 2
在上面的例子中,我们有序列1-1-2,2-2-1,2-2-3和3-3-2,每个序列用零分隔。
使用rnn:maskZero(),rnn
可以检测到这些零,并在检测到时忘记先前的隐藏状态。这实际上意味着BPTT只会在序列的持续时间内反向传播(即零重置BPTT)。