Убыток не уменьшается - Pytorch - PullRequest
0 голосов
/ 23 марта 2019

Я использую потерю игральных костей для своей реализации полностью сверточной сети (FCN), которая включает в себя гиперсети. Модель имеет два входа и один выход, который является двоичной картой сегментации. Модель обновляет вес, но потери постоянны. Это даже не переобучение только на трех учебных примерах

Я также использовал другие функции потерь, такие как игральные кости + потеря бинарной кроссентропии, потеря жакарда и потеря MSE, но потеря почти постоянна. Я также попробовал почти все функции активации, такие как ReLU, LeakyReLU, Tanh. Кроме того, я должен использовать сигмоид на выходе, потому что мне нужно, чтобы мои выходы были в диапазоне [0,1] Скорость обучения составляет 0,01. Кроме того, я пробовал разные скорости обучения, такие как 0,0001, 0,001, 0,1. И независимо от того, с какой потери начинается тренировка, она всегда достигает этой величины

Здесь показаны градиенты для трех обучающих примеров. И общая потеря

tensor(0.0010, device='cuda:0')
tensor(0.1377, device='cuda:0')
tensor(0.1582, device='cuda:0')
Epoch 9, Overall loss = 0.9604763123724196, mIOU=0.019766070265581623
tensor(0.0014, device='cuda:0')
tensor(0.0898, device='cuda:0')
tensor(0.0455, device='cuda:0')
Epoch 10, Overall loss = 0.9616242945194244, mIOU=0.01919178702228237
tensor(0.0886, device='cuda:0')
tensor(0.2561, device='cuda:0')
tensor(0.0108, device='cuda:0')
Epoch 11, Overall loss = 0.960331304506822, mIOU=0.01983801422510155

Я ожидаю, что потери сойдутся в несколько эпох. Что мне делать?

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Это не вопрос переполнения стека. Есть миллион вещей, которые могут быть неправильными, и обычно невозможно выложить достаточное количество кода, чтобы позволить нам точно определить проблему, и даже если бы это было так, никто не мог бы потрудиться прочитать так много.

При этом есть некоторые общие рекомендации, которые часто работают для меня.

  1. Попробуйте уменьшить проблему. Если вы замените свою сеть одним сверточным слоем, будет ли он сходиться? Если да, очевидно, что-то не так с вашей сетью
  2. Посмотрите данные по мере их подачи , а также метки (графики matplotlib и т. Д.). Возможно, вы неверно совмещаете ввод с выводом (проблемы обрезки и т. Д.), Или ваше увеличение данных слишком сильно.
  3. Ищите, ну ... ошибки. Возможно, вы возвращаете torch.sigmoid(x) из своей сети и затем вводите его в torch.nn.functional.binary_cross_entropy_with_logits (эффективно применяя sigmoid дважды). Возможно, ваш последний слой - ReLU, и ваша сеть просто не может (по построению) вывести отрицательные значения там, где вы ожидаете их.

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

0 голосов
/ 08 июля 2019

@ Мухаммад Хамза Мугхал

Вы должны добавить код, по крайней мере, ваших forward и train функций, чтобы мы могли точно определить проблему, @Jatentaki прав, может быть так много вещей, которые могут испортитьдо кода ML / DL.Даже я недавно переехал в pytorch из Keras, потребовалось время, чтобы привыкнуть к нему.Но вот что я бы сделал:

1) Поскольку вы имеете дело с изображениями, попробуйте немного предварительно обработать их (вращение, нормализация, гауссов шум и т. Д.).

2) Zero gradients вашего оптимизатора в начале каждой партии, которую вы получаете, а также step optimizer после того, как вы вычислили потери и вызвали loss.backward().

3) Добавьте термин weight decay к вашему вызову оптимизаторакак правило, L2, поскольку вы имеете дело с сетями Convolution, срок упадка которых равен 5e-4 или 5e-5.

4) Добавьте learning rate scheduler к вашему оптимизатору, чтобы изменить скорость обучения, если нет улучшениячерез некоторое время.

Мы действительно не можем включить код в наши ответы.Практикующий должен выяснить, как реализовать все эти вещи.Надеюсь, это поможет.

...