2016-03-03 15 views
0

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

**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 

在我的测试代码数据张量,我用格式化测试数据(张量为99999x3)的格式对其进行格式化。我希望程序给我一个预测,当我运行这一行时,分类是什么。

print (model:forward(test_data)) 

不过,我正在负数(这不应该与ClassNLLCriterion发生?)和概率之和不增加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.

这是

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] 

对不起,对于迟到的答案。

相关问题