Использование ClassNLLCriterion факела
В настоящее время я использую Torch и просто пытаюсь запустить простую программу нейронной сети. Каждый из моих входов имеет 3 атрибута, и выход должен быть классификацией между числами 1 и 7. Я извлек свои данные из файла CSV и поместил их в 2 тензора (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
В моем тензоре тестовых данных я отформатировал его так же, как форматировал тестовые данные (Тензор 99999x3). Я хочу, чтобы программа дала мне прогноз того, какой будет классификация, когда я запустлю эту строку.
print (model:forward(test_data))
Однако я получаю отрицательные числа (что не должно происходить с ClassNLLCriterion?), И суммы вероятностей не добавляются к 0. Я сомневаюсь, что я либо неправильно отформатировал данные, либо не смог выполнить тренировочный процесс правильно. Если бы кто-нибудь мог помочь мне выяснить, в чем проблема, я был бы очень благодарен.
Спасибо!
2 ответа
Причина, по которой вы не можете видеть предсказание доходности на слое 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]
Извините за столь поздний ответ.
Вот то, что я в настоящее время использую, возможно, неправильный способ использования 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.
Это