Потеря мягкой маржи MultiLabel в PyTorch

Я хочу реализовать классификатор, который может иметь 1 из 10 возможных классов. Я пытаюсь использовать для этого функцию MultiClass Softmax Loss. Просматривая документацию, я не понимаю, какой ввод требуется для функции.

В документации говорится, что ему нужны две матрицы [N, C], одна из которых является входной, а другая - целевой. Насколько я понимаю, входная матрица будет той матрицей, которую будет вычислять моя нейронная сеть, которая будет иметь вероятности, заданные нейронной сетью для каждого из 10 классов. Целью является тот, который у меня есть из моего набора данных.

В документации сказано: «Цель (N, C) - обозначать цели, дополненные -1, обеспечивая ту же форму, что и вход». Что это значит? Могу ли я передать нули в неправильных классах и -1 для правильных?

Было бы здорово, если бы кто-нибудь мог подробнее рассказать об этом и показать хотя бы образец 2-мерной матрицы, которую можно было бы передать как целевую матрицу.


person Vivek    schedule 25.11.2019    source источник


Ответы (2)


Если вы знаете, что для каждого примера у вас есть только 1 из 10 возможных классов, вам следует использовать CrossEntropyLoss , в которые вы передаете прогнозы сетей формы [batch, n_classes] и метки формы [batch] (каждый элемент меток представляет собой целое число от 0 до n_classes-1).

Потеря, на которую вы смотрите, предназначена для ситуаций, когда каждый пример может принадлежать к нескольким классам (скажем, человека можно отнести как к женщине, так и к пожилому). Я думаю, что вас смущает именно это «мульти» - оно означает множественные возможные классификации на пример, а не просто множественные потенциальные ярлыки во всей «вселенной».

В смысле двух или более ярлыков во вселенной, о которых вы, кажется, думали, аналогом CrossEntropyLoss будет _ 6_ (BCE означает двоичную перекрестную энтропию), что является просто упрощением CrossEntropyLoss для случая двух меток.

person Jatentaki    schedule 25.11.2019

В pytorch 1.8.1 я думаю, что правильный способ сделать - это заполнить переднюю часть цели метками и заполнить остальную часть цели -1. Это то же самое, что и MultiLabelMarginLoss, и я получил это из примера MultiLabelMarginLoss.

person Orange Chen    schedule 29.03.2021