Математически BCEloss (logist) - это особый случай потери CrossEntropy для случая двух классов.
Используете ли вы сигмоид или softmax на выходе сети? В PyTorch потеря CrossEntropy принимает необработанный вывод последнего слоя (нет необходимости в softmax выводе), что делается для численной стабильности.
BCEloss принимает данные только в диапазоне от 0 до 1. Так что там нужна сигмоида. Тем не менее, PyTorch имеет BCEWithLogistLoss, который применяет сигмоид для вас, эта версия более стабильна.
Еще одна вещь, которая, кажется, вы делаете не правильно. (было бы лучше иметь минимальное количество кода, чтобы лучше понять вашу проблему). CrossEntropyLoss требуется один канал на класс. Так что, если у вас есть 2 класса, вы должны дать ему вход с двумя каналами. Логист (BCEloss) берет только один канал с числом в диапазоне от 0 до 1. Если я правильно понял, вы как-то даете ему 2 канала. Это принесет вам проблемы при обучении.
Я думаю, что разрыв в производительности между ними связан с неправильным использованием функций потерь. Документация PyTorch значительно улучшилась, я могу порекомендовать вам потратить несколько минут, чтобы понять разницу между этими тремя функциями потерь: https://pytorch.org/docs/stable/nn.html#loss -функции .