我正在尝试在Torch中实施RNN。为了习惯它,我开始用一个简单的任务来预测序列中的下一个项目。序列是{1,2,3,4,5,6,7,8,9,10}的子序列,随机选择偏移量。
我想实现一个带有LSTM单元的隐藏层的网络架构。这就是我使用nn.SeqLSTM(inputsize,outputsize)
的原因rho = 5 -- number of steps for bptt
hiddensize = 15
inputsize = 1
outputsize = 1
seqlen = 5
nIndex = 10
batchsize = 4
seqlstm = nn.SeqLSTM(inputsize, outputsize)
criterion = nn.SequencerCriterion(nn.ClassNLLCriterion())
outputs = seqlstm:forward(inputs) -- inputs is seqlen x batchsize x inputsize
err = criterion:forward(outputs, targets) -- targets is seqlen x batchsize x 1
答案 0 :(得分:2)
除非这不是你的整个代码,否则会有相当多的缺失,而不仅仅是胶水。
1- LSTM图层的输入和输出大小为1没有多大意义
2-除非你真的希望你的网络只反向传播5个步骤,否则我不会乱用rho
3- ClassNLLCriterion期望记录概率为输入
4-您需要一个优化算法才能实际训练您的网络,例如SGD(通过火炬查看optim库)
5-通常,您至少需要网络中的输入层和输出层。输入层将您的输入转换为嵌入,然后通过隐藏层(可能是LSTM层)转发。可以在输入层中使用LookupTable。输出层可能使用softmax层在可能的输出上形成概率分布。
6-确实有点太简单了
nn.LookupTable是一个存储输入嵌入的模块。例如,如果您正在尝试预测序列中的下一个字符,那么您可以使用大小为26xinDim的LookupTable,其中您可以为字母表中的每个字符嵌入大小inDim。你确实可以使用一个。
看着这个,我怀疑你可能不完全熟悉如何构建神经网络。我建议你在进入之前先熟悉一下自己。Here是Michael Nielsen关于深度学习的一本非常好的书。他非常直观地解释了一切。
查看Element-Research / rnn或torch / nn中的示例也非常有用。 Karpathy的char-rnn也很有趣。
我希望这有任何帮助。