Почему мультиклассовая классификация не проходит с сигмоидом? - PullRequest
1 голос
/ 01 апреля 2019

MNIST, обученный с Sigmoid, терпит неудачу, в то время как Softmax работает отлично

Я пытаюсь выяснить, как различная активация влияет на конечные результаты, поэтому я реализовал простую сеть для MNIST с PyTorch.

Я использую NLLLoss (отрицательное логарифмическое правдоподобие), так как он реализует Cross Entropy Loss при использовании с softmax.

Когда у меня есть softmax в качестве активации последнего слоя, он прекрасно работает. Но когда я вместо этого использовал сигмоид, я заметил, что все разваливается

Вот мой сетевой код

def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 80)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.XXXX(x)

где XXXX - функция активации

оба значения выходных сигналов Sigmoid и Softmax между (0, 1). Да, Softmax гарантирует сумму 1, но я не уверен, отвечает ли это, почему тренировка не проходит с Sigmoid. Есть ли какая-то деталь, которую я здесь не улавливаю?

1 Ответ

0 голосов
/ 02 апреля 2019

Сигмоид + кросентропия может использоваться для классификации с несколькими метками (предположим, что изображение с собакой и кошкой, вы хотите, чтобы модель возвращала «собака и кошка»). Он работает, когда классы не являются взаимоисключающими, или образцы содержат более одного объекта, который вы хотите распознать.

В вашем случае MNIST имеет взаимоисключающие классы, и в каждом изображении есть только одно число, поэтому лучше использовать logsoftmax + отрицательное логарифмическое правдоподобие, которое предполагает, что классы являются взаимоисключающими, и только одна правильная метка связана с изображение.

Итак, вы не можете ожидать такого поведения от сигмовидной кишки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...