我正在尝试用元素研究的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 时间步骤完成 .
1 回答
您有一个可变长度序列的数据集,并且您想要进行批处理 . 解决方案是将X和Y组织为
seqlen x batchsize
张量,其中每个独立序列由零(或零的张量)分隔:在上面的例子中,我们有序列1-1-2,2-2-1,2-2-3和3-3-2,每个序列用零分隔 .
使用rnn:maskZero(),
rnn
可以检测到这些零并在检测到时忘记先前的隐藏状态 . 这实际上意味着BPTT将仅在序列的持续时间内反向传播(即,零重置BPTT) .