Element-Research / rnn

Recurrent Neural Network library for Torch7's nn
BSD 3-Clause "New" or "Revised" License
939 stars 313 forks source link

:getParameters() doesn't work on an nn.LSTM() wrapped within nn.Sequencer() - [EDITED] #305

Closed freakeinstein closed 8 years ago

freakeinstein commented 8 years ago

Hi, I've edited my issue, 'cause I've resolved some part of it. Here are its unresolved parts:

mod = nn.Sequencer(nn.Sequential():add(nn.LSTM(10,10)))
criterion = nn.MSECriterion()

data_in = torch.split(torch.randn(10,10),1)
data_out = torch.split(torch.randn(10,10),1)

param,grads = mod:getParameters()

for i = 1,#data_in do
    mod:training()
    mod:zeroGradParameters()

    out = mod:forward(data_in[i])
    error = criterion:forward(out,data_out[i])
    grad = criterion:backward(out,data_out[i])
    mod:backward(data_in[i],grad)

    print(param[20],grads[20])
    mod:updateParameters(0.001)
    print(param[20],grads[20])
end
nicholas-leonard commented 8 years ago
require 'rnn'

mod = nn.Sequencer(nn.LSTM(10,10))
criterion = nn.SequencerCriterion(nn.MSECriterion())

data_in = torch.split(torch.randn(10,10),1)
data_out = torch.split(torch.randn(10,10),1)

param,grads = mod:getParameters()

mod:training()

for i=1,2 do
   mod:zeroGradParameters()

   out = mod:forward(data_in)
   error = criterion:forward(out,data_out)
   grad = criterion:backward(out,data_out)
   mod:backward(data_in,grad)

   print(param[20],grads[20])
   mod:updateParameters(0.001)
   print(param[20],grads[20])
end

Forward your entire sequence at once (like above). Or use remember('both') to tell the rnn to remember the hidden states between successive calls to forward:

require 'rnn'
mod = nn.Sequencer(nn.Sequential():add(nn.LSTM(10,10)))
criterion = nn.MSECriterion()

data_in = torch.split(torch.randn(10,10),1)
data_out = torch.split(torch.randn(10,10),1)

param,grads = mod:getParameters()

mod:remember()

for i = 1,#data_in do
    mod:training()
    mod:zeroGradParameters()

    out = mod:forward(data_in[i])
    error = criterion:forward(out,data_out[i])
    grad = criterion:backward(out,data_out[i])
    mod:backward(data_in[i],grad)

    print(param[20],grads[20])
    mod:updateParameters(0.001)
    print(param[20],grads[20])
end
freakeinstein commented 8 years ago

and when and where to apply forget() ?