2

1 つの入力と 1 つの出力を持つおもちゃのデータセットがあります。入力はランダムな 0 または 1 で、出力は前の 3 つのサンプルからの入力と同じです。

Input, Output
0,1
1,1
0,0
1,0
0,1
0,0

モデル 1:

lstm = nn.Sequential()
lstm:add(nn.LSTM(1,20,8))
lstm:add(nn.Linear(20,100))
lstm:add(nn.Sigmoid())
lstm:add(nn.Linear(100,1))
lstm:add(nn.Sigmoid())

モデル 2:

lstm = nn.Sequencer(
   nn.Sequential()
      :add(nn.LSTM(1,100))
      :add(nn.Linear(100,1))
      :add(nn.Sigmoid())
   )

基準:

criterion = nn.BCECriterion()
trainer = nn.StochasticGradient(lstm, criterion)
trainer.learningRate = .01
trainer.maxIteration = 25

最初のモデルは学習せず、2 番目のモデルは機能しません (私のデータがシーケンサーにとって間違った種類である可能性があります)。

編集:

トレーニング:

lstm:training()
print("Training")
for epoch=1, 5 do
  err = 0
  for i = 1,data:size() do
    input = {}
    output = {}
    table.insert(input, data[i][1])
    table.insert(output, data[i][2])
    --input = data[i][1]
    --output = data[i][2]
    err = err + criterion:forward(lstm:updateOutput(input)[1], output)
    lstm:zeroGradParameters()
    lstm:backward(input, {criterion:backward(lstm.output[1], output)})
    lstm.modules[1]:backwardThroughTime()
    lstm:updateParameters(0.01)
    lstm.modules[1]:forget()
  end
  print (err / data:size())
end

トレーニングを通じてモデル 2 を実行すると、エラーが発生するようになりました。エラー

AbstractRecurrent.lua:61: gradInput がありません

オンラインで発生

lstm.modules[1]:backwardThroughTime()

4

1 に答える 1

2

Sequencer で LSTM を使用するおもちゃの例を見てください。このモデルは、乱数を予測しようとする以外は何もしません。

require 'nn'
require 'torch'
require 'rnn'

lstm = nn.Sequencer(
   nn.Sequential()
      :add(nn.LSTM(1,100))
      :add(nn.Linear(100,1))
      :add(nn.Sigmoid())
   )

-- Encapsulate thr criterion using a Sequencer
-- Just provide the entire sequence as input and the corresponding
-- target sequence as expected output
criterion = nn.SequencerCriterion(nn.BCECriterion())

data = torch.zeros(10,2)
for i=1,data:size(1) do
  data[i][1] = torch.uniform()
  data[i][2] = torch.uniform()
end

local inputs, targets = {},{}

for epoch=1,5 do
  lstm:training()

  for i=1,data:size(1) do
    --useful for minibatch
    inputs[1] = torch.zeros(1)
    inputs[1][1] = data[i][1]

    targets[1] = torch.zeros(1)
    targets[1][1] = data[i][2]

    local output = lstm:forward(inputs)
    local err = criterion:forward(output, targets)

    local gradOutputs = criterion:backward(output, targets)
    -- Sequencer handles the backwardThroughTime internally
    lstm:backward(inputs, gradOutputs)
    lstm:updateParameters(0.01)
    lstm:zeroGradParameters()

    inputs = {}
    targets = {}
  end
end
于 2015-11-26T05:36:55.783 に答える