我目前正在使用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.我怀疑是我没有正确格式化数据或者我没有能够正确执行培训过程。如果有人能帮我弄清问题是什么,我将非常感激。
谢谢!
答案 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]
对不起,迟到了。