Какой слой увеличивает размер на обратном пути в U-Net и как он работает
Что проверяют
Понимаете ли вы, как декодер U-Net возвращает карте признаков исходное разрешение и зачем там нужны skip connections. «Обратный путь» здесь означает правую, расширяющую часть сети, а не обратное распространение ошибки. Следом обычно просят сравнить транспонированную свёртку с интерполяцией и объяснить, откуда берутся шахматные артефакты.
Как отвечать
В оригинальной статье 2015 года это up-convolution 2×2, по сути транспонированная свёртка. На каждом уровне декодера повторяется одно и то же:
- транспонированная свёртка:
nn.ConvTranspose2d(c, c // 2, kernel_size=2, stride=2)удваивает высоту и ширину и вдвое уменьшает число каналов; - конкатенация: результат склеивается по каналам с картой признаков того же уровня из энкодера. Именно она возвращает мелкие детали и точные границы, потерянные при пулинге;
- две свёртки 3×3 с ReLU: смешивают грубый контекст снизу и детали из skip connection.
Как работает сама операция. Каждый входной пиксель умножается на ядро, результат кладётся в выход с шагом stride, перекрывающиеся вклады суммируются. Эквивалентная картина: между входными пикселями вставляют нули и проходят по результату обычной свёрткой. «Транспонированной» её называют потому, что это та же линейная операция, что и градиент свёртки по входу. Ядро обучается, то есть сеть сама решает, как восстанавливать детали. При kernel_size=2, stride=2 и нулевом паддинге выход ровно вдвое больше входа.
Альтернатива: nn.Upsample(scale_factor=2, mode="bilinear") и следом обычная свёртка. У интерполяции нет весов, зато нет и шахматного узора.
Где спотыкаются
Называют слой деконволюцией и говорят, что он обращает свёртку. Он восстанавливает только размер, а не исходные значения.
Не знают про шахматные артефакты. Они появляются, когда размер ядра не делится на шаг и вклады перекрываются неравномерно. У ядра 2 со страйдом 2 перекрытий нет, а ядро 3 со страйдом 2 уже даёт узор.
Путают конкатенацию со сложением. В U-Net признаки склеиваются по каналам, суммирование используют ResNet и FPN. Рядом и ошибка с размерами: при четырёх уровнях пулинга и входе, не кратном 16, карты не совпадают, и нужны паддинг или обрезка.