Функция потерь для семантической сегментации

10

Приносит свои извинения за неправильное использование технических терминов. Я работаю над проектом семантической сегментации с помощью сверточных нейронных сетей (CNN); пытаясь реализовать архитектуру типа Encoder-Decoder, поэтому размер вывода совпадает с размером ввода.

Как вы оформляете этикетки? Какую функцию потерь следует применять? Особенно в ситуации тяжелого дисбаланса классов (но соотношение между классами варьируется от изображения к изображению).

Задача касается двух классов (объекты интереса и фона). Я использую Keras с бэкэндом тензорного потока.

До сих пор я собираюсь разработать ожидаемые выходные данные, которые будут иметь те же размеры, что и входные изображения, применяя пиксельную маркировку. Конечный слой модели имеет либо активацию softmax (для 2 классов), либо сигмовидную активацию (чтобы выразить вероятность того, что пиксели принадлежат классу объектов). У меня проблемы с разработкой подходящей целевой функции для такой задачи, типа:

function(y_pred,y_true),

по согласованию с Керасом .

Пожалуйста, попробуйте конкретизировать размеры задействованных тензоров (вход / выход модели). Любые мысли и предложения очень ценятся. Спасибо !

Флорин Лукачу
источник
Прочитайте это arxiv.org/pdf/1511.00561.pdf «Мы используем кросс-энтропийную потерю в качестве целевой функции для обучения сети».
Мисс Палмер

Ответы:

6

Перекрестная энтропия, безусловно, путь. Я не знаю Keras, но у TF есть это: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Вот документ, непосредственно реализующий это: Полностью сверточные сети для семантической сегментации. Автор Shelhamer et al.

Документ U-Net также является очень успешной реализацией идеи, использующей пропускаемые соединения, чтобы избежать потери пространственного разрешения. Вы можете найти много реализаций этого в сети.

Исходя из моего личного опыта, вы можете сначала начать с простой сети кодер-декодер, но не используйте шаги (или шаги = 1), иначе вы потеряете много разрешения, потому что повышающая дискретизация не идеальна. Пойдите с маленькими размерами ядра. Я не знаю вашего конкретного приложения, но даже сеть из 2-3 скрытых слоев даст очень хорошие результаты. Используйте 32-64 канала на каждом слое. Начните с простого, 2 скрытых слоя, 32 канала каждый, ядра 3х3, шаг = 1 и экспериментируйте с параметрами изолированно, чтобы увидеть их эффект. Держите размеры всегда равными входному измерению для начинающих, чтобы избежать потери разрешения. После этого вы можете включить прогресс и повышение частоты дискретизации и реализовать такие идеи, как U-Net. U-Net прекрасно работает для сегментации медицинских изображений.

Информацию о дисбалансе классов см. На странице https://swarbrickjones.wordpress.com/2017/03/28/cross-entropy-and-training-test-class-imbalance/. Здесь идея состоит в том, чтобы взвесить различные классы с помощью и параметры.αβ


источник
Я не эксперт в этой области, но разве классы не должны быть эксклюзивными в этой ситуации? Если да, не будет ли потеря Softmax лучшим вариантом? tenorflow.org/api_docs/python/tf/nn/…
Харальд Томсон
1
@HaraldThomson, Сегментация - это бинарная проблема. Многие люди используют softmax для бинарных задач, но это совершенно не нужно и излишне. Вместо того, чтобы иметь два выходных узла, имейте один выходной узел, который представляет P (y = 1), затем используйте перекрестную энтропию.
Рикардо Круз,
2

Используйте взвешенные потери в кости и взвешенные перекрестные потери энтропии. Потеря костей очень хороша для сегментации. Весами, с которых вы можете начать, должны быть инвертированные частоты классов, т. Е. Взять выборку, скажем, 50-100, найти среднее число пикселей, принадлежащих каждому классу, и сделать вес этих классов 1 / среднее. Возможно, вам придется реализовать кости самостоятельно, но это просто. Кроме того, вы можете посмотреть в обратной потере кости и очаговой потере

Рахул Деора
источник
-1

Позвольте мне сначала быть более конкретным, а затем более общим. Я прошу прощения, если я вас неправильно понял.

Я думаю, что вы говорите о необходимости нейронной сети автоэнкодера, потому что вы упомянули кодирование и декодирование, и вы упомянули размер ввода такой же, как размер вывода. Если это так, то ваша функция потерь основана на воспроизведении входного вектора, а также на сжатии данных в более короткий вектор в среднем скрытом слое. Выбор будет заключаться в достижении минимальной среднеквадратичной ошибки (для регрессии) или коэффициента логлосса или ошибочной классификации (для классификации). Тем не менее, CNN - это не то, что я видел в авто-кодере, но я думаю, что это было бы возможно и полезно в тех случаях, когда важна трансляционная инвариантность, например, при обнаружении границ и объектов в изображениях.

В более общем смысле, вы, кажется, строите очень сложную модель машинного обучения, так как упомянули CNN. CNN и другие модели глубокого обучения являются одними из самых сложных моделей машинного обучения, которые существуют.

Однако выбор размеров, меток и функций потерь больше похож на элементарное машинное обучение. Я думаю, что вы можете быть глубоко над головой с глубоким изучением. Вы сначала брали урок по обычному машинному обучению?

Джеффри Андерсон
источник
Это даже необходимо? Например, см. Метод Pixon .
Карл
это правильный подход: arxiv.org/pdf/1511.00561.pdf
мисс Палмер
«CNN и другие модели глубокого обучения являются одними из самых сложных моделей машинного обучения, которые существуют». Я склонен не соглашаться Модель сама по себе может быть сложной, но на самом деле она невероятно проста в использовании с очень небольшим теоретическим пониманием. В этом причина всей шумихи по поводу DL, небольшой теории, простоты написания моделей и очень высокой точности ...