Мультиклассовая классификация с Pytorch - PullRequest
1 голос
/ 30 марта 2020

Я новичок в Pytorch и мне нужно уточнить классификацию мультиклассов.

Я настраиваю нейронную сеть Dens eNet, чтобы она могла распознавать 3 разных класса.

Поскольку это проблема мультикласса, я должен заменить классификационный слой следующим образом:

kernelCount = self.densenet121.classifier.in_features
self.densenet121.classifier = nn.Sequential(nn.Linear(kernelCount, 3), nn.Softmax(dim=1))

и использовать CrossEntropyLoss в качестве функции потерь:

loss = torch.nn.CrossEntropyLoss(reduction='mean')

Читая на форуме Pytorch Я обнаружил, что CrossEntropyLoss применяет функцию softmax к выходу нейронной сети. Это правда? Должен ли я удалить функцию активации Softmax из структуры сети?

А как на этапе тестирования? Если он включен, мне нужно вызвать функцию softmax на выходе модели?

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 30 марта 2020

Да, CrossEntropyLoss применяет softmax неявно. Вы должны удалить слой softmax в конце сети, поскольку softmax является , а не идемпотентом, поэтому его двойное применение будет ошибкой semanti c.

Что касается оценки / тестирования , Помните, что softmax является монотонно возрастающей операцией (то есть относительный порядок выводов не изменяется при его применении). Поэтому результат argmax до и после softmax даст один и тот же результат.

Единственный раз, когда вы захотите явно выполнить softmax во время оценки, будет, если вам по какой-то причине понадобится фактическое значение достоверности. При необходимости вы можете применить softmax явно, используя torch.softmax на выходе сети во время оценки.

...