Использование 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.

Это

Другие вопросы по тегам