2016-12-11 2 views
0

ここでは基本的なチュートリアルモデルを変更しようとしています(http://rnduja.github.io/2015/10/13/torch-mnist/ )トーチの深いモデルここに私のコードです(私は上記URL内の同じモデルをしようとしたときにコードが働いていた):。Torch MNIST: 'v'(3Dまたは4D入力のテンソルが期待されていますが、得られた:[199 x 784])を修正する方法

ロードデータ

require 'torch' 
require 'nn' 
require 'optim' 
mnist = require 'mnist' 
fullset = mnist.traindataset() 
testset = mnist.testdataset() 
trainset = { 
    size = 50000, 
    data = fullset.data[{{1,50000}}]:double(), 
    label = fullset.label[{{1,50000}}] 
} 
validationset = { 
    size = 10000, 
    data = fullset.data[{{50001,60000}}]:double(), 
    label = fullset.label[{{50001,60000}}] 
} 

は降下を定義

model = nn.Sequential() 
model:add(nn.Reshape(28*28)) 
model:add(nn.SpatialConvolution(1, 32, 3, 3)) 
model:add(nn.ReLU()) 
model:add(nn.SpatialConvolution(32, 32, 3, 3)) 
model:add(nn.ReLU()) 
model:add(nn.SpatialMaxPooling(2, 2, 2, 2)) 
-- model:add(nn.SpatialDropout(0.25)) -- Ignored for simplicity. 

-- model:add(nn.Reshape(12*12*32)) 
model:add(nn.View(12*12*32)) 
model:add(nn.Linear(12*12*32, 128)) 
model:add(nn.ReLU()) 
-- model:add(nn.SpatialDropout(0.5)) -- Ignored for simplicity. 
model:add(nn.Linear(128, 10)) 
model:add(nn.SoftMax()) 
criterion = nn.ClassNLLCriterion() 

ネットワークを定義しますアルゴrithm

sgd_params = { 
    learningRate = 1e-2, 
    learningRateDecay = 1e-4, 
    weightDecay = 1e-3, 
    momentum = 1e-4 
} 
x, dl_dx = model:getParameters() 
step = function(batch_size) 
    local current_loss = 0 
    local count = 0 
    local shuffle = torch.randperm(trainset.size) 
    batch_size = batch_size or 200 

    for t = 1,trainset.size,batch_size do 
     -- setup inputs and targets for this mini-batch 
     local size = math.min(t + batch_size - 1, trainset.size) - t 
     local inputs = torch.Tensor(size, 28, 28) 
     local targets = torch.Tensor(size) 
     for i = 1,size do 
      local input = trainset.data[shuffle[i+t]] 
      local target = trainset.label[shuffle[i+t]] 
      -- if target == 0 then target = 10 end 
      inputs[i] = input 
      targets[i] = target 
     end 
     targets:add(1) 

     local feval = function(x_new) 
      -- reset data 
      if x ~= x_new then x:copy(x_new) end 
      dl_dx:zero() 

      -- perform mini-batch gradient descent 
      local loss = criterion:forward(model:forward(inputs), targets) 
      model:backward(inputs, criterion:backward(model.output, targets)) 

      return loss, dl_dx 
     end 

     _, fs = optim.sgd(feval, x, sgd_params) 
     -- fs is a table containing value of the loss function 
     -- (just 1 value for the SGD optimization) 
     count = count + 1 
     current_loss = current_loss + fs[1] 
    end 

    -- normalize loss 
    return current_loss/count 
end 
eval = function(dataset, batch_size) 
    local count = 0 
    batch_size = batch_size or 200 

    for i = 1,dataset.size,batch_size do 
     local size = math.min(i + batch_size - 1, dataset.size) - i 
     local inputs = dataset.data[{{i,i+size-1}}] 
     local targets = dataset.label[{{i,i+size-1}}]:long() 
     local outputs = model:forward(inputs) 
     local _, indices = torch.max(outputs, 2) 
     indices:add(-1) 
     local guessed_right = indices:eq(targets):sum() 
     count = count + guessed_right 
    end 

    return count/dataset.size 
end 

電車

max_iters = 30 
do 
    local last_accuracy = 0 
    local decreasing = 0 
    local threshold = 1 -- how many deacreasing epochs we allow 
    for i = 1,max_iters do 
     local loss = step() 
     print(string.format('Epoch: %d Current loss: %4f', i, loss)) 
     local accuracy = eval(validationset) 
     print(string.format('Accuracy on the validation set: %4f', accuracy)) 
     if accuracy < last_accuracy then 
      if decreasing > threshold then break end 
      decreasing = decreasing + 1 
     else 
      decreasing = 0 
     end 
     last_accuracy = accuracy 
    end 
end 

、今私は列車の一部を実行したときに、私は、次のエラーメッセージが表示されます。

...s/username/torch/install/share/lua/5.1/nn/Container.lua:67: 
In 2 module of nn.Sequential: 
/Users/username/torch/install/share/lua/5.1/nn/THNN.lua:110: bad argument #2 to 'v' (3D or 4D input tensor expected but got: [199 x 784] at /tmp/luarocks_nn-scm-1-2325/nn/lib/THNN/generic/SpatialConvolutionMM.c:33) 
stack traceback: 
    [C]: in function 'v' 
    /Users/username/torch/install/share/lua/5.1/nn/THNN.lua:110: in function 'SpatialConvolutionMM_updateOutput' 
    ...go/torch/install/share/lua/5.1/nn/SpatialConvolution.lua:79: in function <...go/torch/install/share/lua/5.1/nn/SpatialConvolution.lua:76> 
    [C]: in function 'xpcall' 
    ...s/username/torch/install/share/lua/5.1/nn/Container.lua:63: in function 'rethrowErrors' 
    .../username/torch/install/share/lua/5.1/nn/Sequential.lua:44: in function 'forward' 
    [string "step = function(batch_size)..."]:27: in function 'opfunc' 
    /Users/username/torch/install/share/lua/5.1/optim/sgd.lua:44: in function 'sgd' 
    [string "step = function(batch_size)..."]:33: in function 'step' 
    [string "do..."]:6: in main chunk 
    [C]: in function 'xpcall' 
    ...rs/username/torch/install/share/lua/5.1/itorch/main.lua:210: in function <...rs/username/torch/install/share/lua/5.1/itorch/main.lua:174> 
    ...rs/username/torch/install/share/lua/5.1/lzmq/poller.lua:75: in function 'poll' 
    ...username/torch/install/share/lua/5.1/lzmq/impl/loop.lua:307: in function 'poll' 
    ...username/torch/install/share/lua/5.1/lzmq/impl/loop.lua:325: in function 'sleep_ex' 
    ...username/torch/install/share/lua/5.1/lzmq/impl/loop.lua:370: in function 'start' 
    ...rs/username/torch/install/share/lua/5.1/itorch/main.lua:389: in main chunk 
    [C]: in function 'require' 
    (command line):1: in main chunk 
    [C]: at 0x0100c03350 

WARNING: If you see a stack trace below, it doesn't point to the place where this error occurred. Please use only the one above. 
stack traceback: 
    [C]: in function 'error' 
    ...s/username/torch/install/share/lua/5.1/nn/Container.lua:67: in function 'rethrowErrors' 
    .../username/torch/install/share/lua/5.1/nn/Sequential.lua:44: in function 'forward' 
    [string "step = function(batch_size)..."]:27: in function 'opfunc' 
    /Users/username/torch/install/share/lua/5.1/optim/sgd.lua:44: in function 'sgd' 
    [string "step = function(batch_size)..."]:33: in function 'step' 
    [string "do..."]:6: in main chunk 
    [C]: in function 'xpcall' 
    ...rs/username/torch/install/share/lua/5.1/itorch/main.lua:210: in function <...rs/username/torch/install/share/lua/5.1/itorch/main.lua:174> 
    ...rs/username/torch/install/share/lua/5.1/lzmq/poller.lua:75: in function 'poll' 
    ...username/torch/install/share/lua/5.1/lzmq/impl/loop.lua:307: in function 'poll' 
    ...username/torch/install/share/lua/5.1/lzmq/impl/loop.lua:325: in function 'sleep_ex' 
    ...username/torch/install/share/lua/5.1/lzmq/impl/loop.lua:370: in function 'start' 
    ...rs/username/torch/install/share/lua/5.1/itorch/main.lua:389: in main chunk 
    [C]: in function 'require' 
    (command line):1: in main chunk 
    [C]: at 0x0100c03350 

私は、入力データに:view(1, 28, 28)を追加することによって、またはinputs = torch.Tensor(size, 28, 28)からinputs = torch.Tensor(size, 1, 28, 28)したいと変更することで、ここで溶液(Torch mnist simple)に基づいて修正しようとした、しかし、彼らは問題を解決しませんでした。

私は他に何を試すことができるのか分かりませんし、このタイプのエラーをどのようにデバッグするのかまだ分かりません。ご協力ありがとうございました。

+0

エラーは、次の文で発生しました。ローカル損失=基準:forward(モデル:forward(inputs)、targets) しかし、入力とターゲットの詳細を確認すると、[torch.DoubleTensorはサイズ199x28x28]、[torch.DoubleTensorはサイズ199] [199×784]ない.... – kangaroo

答えて

0

モデルでの실수실수は、この文章を必要としませんでした:model:add(nn.Reshape(28*28))。それをコメントアウトした後、別のエラーが発生しました。

……./torch/install/share/lua/5.1/nn/THNN.lua:110: Need input of dimension 3 and input.size[0] == 1 but got input to be of shape: [199 x 28 x 28] at /tmp/luarocks_nn-scm-1-2325/nn/lib/THNN/generic/SpatialConvo‌​lutionMM.c:47 

次に、Torchのターゲットは分類に0を受け入れないことがわかったので、代わりに10を必要としました。以下のことが助けになりました。

https://github.com/torch/nn/issues/471

Torch7 ClassNLLCriterion()

http://nn.readthedocs.io/en/rtd/criterion/

関連する問題