使用Torch的ClassNLLCriterion

时间:2016-03-03 04:08:21

标签: neural-network deep-learning torch

我目前正在使用Torch并试图让一个简单的神经网络程序运行。我的每个输入都有3个属性,输出应该是数字1和7之间的分类。我从CSV文件中提取了我的数据并将其放入2个Tensors(1个带输入,1个带有输出)。数据采用这种格式。

  **Data**
  1914  1993  2386
  1909  1990  2300 
  .....
  1912  1989  2200
  [torch.DoubleTensor of size 99999x3]


  **Class**
  1
  1
  2 
  .....
  7
  [torch.DoubleTensor of size 99999]

对于我用来训练网络的模型,我只是

 model = nn.Sequential()
 model:add(nn.Linear(3, 7))
 model:add(nn.LogSoftMax())
 criterion = nn.ClassNLLCriterion()

这是我训练网络的代码

for int i = 1, 10 do
     prediction = model:forward(data)
     loss = criterion:forward(prediction, class)
     model:zeroGradParameters()
     grad = criterion:backward(prediction, class)
     model:backward(data, grad)
     model:updateParameters(.1)
 end

在我的测试数据张量中,我将其格式化为与格式化测试数据(Tensor of 99999x3)相同的格式。我想让程序给出一个关于运行此行时分类的预测。

 print (model:forward(test_data))

然而,我得到负数(这不应该发生在ClassNLLCriterion?)并且概率的总和不会增加到0.我怀疑是我没有正确格式化数据或者我没有能够正确执行培训过程。如果有人能帮我弄清问题是什么,我将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

这是我目前使用的,这可能是使用classnllcriterion的错误方法,但至少它会让你在某处理解它。

使目标成为

(7,1,1,1,1,1,1) <--First class representation
.......
(1,1,1,1,1,1,7) <--Last class representation

 (1,1,1,1,1,1,1) <--First class representation
 .......
 (7,7,7,7,7,7,7) <--Last class representation

我认为将最后一个表示作为目标进行训练要容易得多,但我觉得我们应该使用第一个表示作为目标。

编辑:我刚刚发现classnllcriterion只接受标量作为目标,因此使用上述内容是错误的!

您应该使用 1 .. 7作为目标值,只需1或仅7。

那是

答案 1 :(得分:0)

您无法在实现model:add(nn.LogSoftMax())函数的图层log上看到预测结果的原因,这就是为什么您有负值(它们不是概率)的原因。例如,要获得概率,您应该这样做:

model = nn.Sequential()
model:add(nn.Linear(3, 7));
model:add(nn.LogSoftMax());
criterion = nn.ClassNLLCriterion();
data = torch.Tensor{1914,  1993 , 2386}
print (model:forward(data):exp())

>>  0.0000
  0.0000
  1.0000
  0.0000
  0.0000
  0.0000
  0.0000 [torch.DoubleTensor of size 7]

对不起,迟到了。