Что помогает U-Net сохранять информацию на низкоуровневых признаках?
Что проверяют
Знаете ли вы, зачем в U-Net пропускные соединения, и понимаете ли, что именно теряется при понижении разрешения. Заодно проверяют, читали ли вы код архитектуры, а не только картинку с буквой U.
Как отвечать
Энкодер уменьшает пространственный размер и наращивает число каналов: семантика растёт, точная геометрия пропадает, потому что пулинг необратим. Декодер возвращает разрешение, но восстановить утраченные детали из низкого разрешения нечем.
Пропускные соединения передают карты признаков с каждого уровня энкодера напрямую в соответствующий уровень декодера. Там они склеиваются по каналам с результатом апсемплинга, и следующая свёртка сама решает, сколько взять от деталей и сколько от семантики. Отсюда чёткие границы масок, лучшее качество на мелких объектах и короткий путь градиента к ранним слоям.
Детали, которые показывают знакомство с реализацией:
- склейка именно конкатенацией по каналам, а не сложением, поэтому вход декодера получает удвоенное число каналов;
- в исходной статье свёртки без дополнения краёв, поэтому карты энкодера центрально обрезают перед склейкой; с дополнением обрезка не нужна;
- апсемплинг делают транспонированной свёрткой или интерполяцией со свёрткой следом.
Где спотыкаются
Отвечают «пропускные соединения как в ResNet». В остаточном блоке это сложение внутри одного уровня ради градиента, здесь конкатенация между разными уровнями ради пространственных деталей. Разницу видно по числу каналов на входе декодера.
Второе: не могут сказать, что теряет пулинг. Ответ простой: точные координаты. Сеть уверенно знает, что объект есть, но не знает, где именно проходит его граница, и без пропускных соединений маска получается размытой.
Третье: забывают про размеры. При входе, не кратном степени двойки, после нескольких понижений карты перестают совпадать по пикселям, и склейка падает с ошибкой формы. Лечится дополнением входа до кратного размера или обрезкой.