【问题标题】:Torch CrossEntropyCriterion errorTorch CrossEntropyCriterion 错误
【发布时间】:2016-05-17 21:55:15
【问题描述】:

我正在尝试在 Torch 的 XOR 函数上训练一个简单的测试网络。当我使用 MSECriterion 时它可以工作,但是当我尝试 CrossEntropyCriterion 时它会失败并显示以下错误消息:

/home/a/torch/install/bin/luajit: /home/a/torch/install/share/lua/5.1/nn/THNN.lua:699: Assertion `cur_target >= 0 && cur_target < n_classes' failed.  at /tmp/luarocks_nn-scm-1-6937/nn/lib/THNN/generic/ClassNLLCriterion.c:31
stack traceback:
    [C]: in function 'v'
    /home/a/torch/install/share/lua/5.1/nn/THNN.lua:699: in function 'ClassNLLCriterion_updateOutput'
    ...e/a/torch/install/share/lua/5.1/nn/ClassNLLCriterion.lua:41: in function 'updateOutput'
    ...torch/install/share/lua/5.1/nn/CrossEntropyCriterion.lua:13: in function 'forward'
    .../a/torch/install/share/lua/5.1/nn/StochasticGradient.lua:35: in function 'train'
    a.lua:34: in main chunk
    [C]: in function 'dofile'
    /home/a/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:145: in main chunk
    [C]: at 0x00406670

在将其分解为 LogSoftMax 和 ClassNLLCriterion 时,我收到相同的错误消息。代码是:

dataset={};
function dataset:size() return 100 end -- 100 examples
for i=1,dataset:size() do
  local input = torch.randn(2);     -- normally distributed example in 2d
  local output = torch.Tensor(2);
  if input[1]<0 then
      input[1]=-1
  else
      input[1]=1
  end
  if input[2]<0 then
      input[2]=-1
  else
      input[2]=1
  end
  if input[1]*input[2]>0 then     -- calculate label for XOR function
    output[2] = 1;
  else
    output[1] = 1
  end
  dataset[i] = {input, output}
end

require "nn"
mlp = nn.Sequential();  -- make a multi-layer perceptron
inputs = 2; outputs = 2; HUs = 20; -- parameters
mlp:add(nn.Linear(inputs, HUs))
mlp:add(nn.Tanh())
mlp:add(nn.Linear(HUs, outputs))

criterion = nn.CrossEntropyCriterion()
trainer = nn.StochasticGradient(mlp, criterion)
trainer.learningRate = 0.01
trainer:train(dataset)

x = torch.Tensor(2)
x[1] =  1; x[2] =  1; print(mlp:forward(x))
x[1] =  1; x[2] = -1; print(mlp:forward(x))
x[1] = -1; x[2] =  1; print(mlp:forward(x))
x[1] = -1; x[2] = -1; print(mlp:forward(x))

【问题讨论】:

    标签: machine-learning neural-network torch cross-entropy


    【解决方案1】:

    MSE 标准是为回归问题设计的。当它用于分类任务时,目标应该是 one-hot 向量。交叉熵/负对数似然标准专门用于分类;因此,无需将目标类显式表示为向量。在torch 中,此类标准的目标只是分配的类的索引(1 到类的数量)。

    【讨论】:

    • 这是有道理的,但是如何让输出成为这样的索引呢?仅仅将输出数量减少到一个就会产生错误attempt to index local 'input' (a number value)
    • @rwallace,您可以像这样获取每行中最大元素的索引:_, max_indexes = one_hot:max(2)
    猜你喜欢
    • 2019-05-21
    • 2018-09-12
    • 2015-08-15
    • 2016-01-25
    • 2022-01-28
    • 2019-05-18
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多