Сверточные слои: дополнять или не дополнять?

19

Архитектура AlexNet использует заполнение нулями, как показано на рисунке: введите описание изображения здесь Однако в статье нет объяснения, почему вводится это заполнение.

Курс Standford CS 231n учит, что мы используем отступы для сохранения пространственного размера: введите описание изображения здесь

Мне интересно, это единственная причина, по которой нам нужно набивать? Я имею в виду, если мне не нужно сохранять пространственный размер, я могу просто удалить отступы? Я знаю, что это приведет к очень быстрому уменьшению пространственных размеров при переходе на более глубокие уровни. Тем не менее, я могу компромисс, удалив пул слоев. Я был бы очень рад, если бы кто-нибудь мог дать мне какое-то обоснование для заполнения нулями. Благодарность!

Джумабек Алиханов
источник

Ответы:

20

Есть несколько причин, почему важно заполнение:

  1. Проектирование сетей проще, если мы сохраняем heightи widthне должны слишком беспокоиться о тензорных измерениях при переходе от одного слоя к другому, потому что измерения просто «работают» .

  2. Это позволяет нам проектировать более глубокие сети . Без заполнения уменьшение объема будет уменьшаться слишком быстро.

  3. Заполнение фактически улучшает производительность, сохраняя информацию на границах .

Цитата из лекций Стэнфорда: «В дополнение к вышеупомянутому преимуществу сохранения постоянных пространственных размеров после CONV, это фактически улучшает производительность. Если слои CONV не должны заполнять нулями входные данные и выполнять только действительные свертки, то размер объемы будут уменьшаться на небольшое количество после каждого CONV, а информация на границах будет «смыта» слишком быстро ». - источник

  1. Как уже говорилось в @dontloo, новые сетевые архитектуры должны объединять сверточные слои с фильтрами 1x1, 3x3 и 5x5, и было бы невозможно, если бы они не использовали заполнение, потому что размеры не совпадают. Посмотрите это изображение начального модуля, чтобы лучше понять, почему заполнение здесь полезно.

введите описание изображения здесь

Drag0
источник
4
Почему заполнение нулями так вездесуще? В обработке изображений используется много различных режимов границы, таких как различные типы зеркального отображения или продолжение со значением на краю. Чистые нули имеют очень различную структуру по сравнению с реальными изображениями / функциями.
Изаранди
3

Мне кажется, самая важная причина - сохранить пространственные размеры. Как вы сказали, мы можем компенсировать уменьшение пространственного размера, удаляя пулы слоев. Однако многие недавние сетевые структуры (такие как остаточные сети , начальные сети , фрактальные сети ) работают на выходах разных слоев, что требует согласованного пространственного размера между ними.

Другое дело, что если заполнение отсутствует, пиксели в углу ввода влияют только на пиксели в соответствующем углу вывода, в то время как пиксели в центре вносят вклад в соседство в выводе. Когда несколько слоев без заполнения объединяются вместе, сеть как бы игнорирует граничные пиксели изображения.

Просто некоторые из моих пониманий, я считаю, что есть и другие веские причины.

dontloo
источник
2

Отличный вопрос Drag0 хорошо объяснил, но я согласен, что-то не так.

Это как смотреть на фотографию и иметь дело с границей. В реальной жизни вы можете двигать глазами, чтобы смотреть дальше; Никаких реальных границ не существует. Так что это ограничение среды.

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

невежественный
источник
1

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

а как насчет в прошлый раз? векторное разрешение изображения очень мало, а значение пикселя означает вектор некоторого глобального размера.

Я думаю, что в последнем случае какое-то отражение лучше, чем заполнение нулями.

user225549
источник
1

При разработке информации на границе, в основном, пиксель в углу (заштрихованный зеленым цветом), когда свёртка сделана, будет использоваться только один раз, тогда как посередине, как заштрихованный красный, будет многократно вносить вклад в получившуюся карту объектов. Подкладываем изображение См. рисунок: 2 .

Jatin
источник
1

Я постараюсь на основании информации сказать, когда можно начинать, а когда нет.

Давайте для базового случая возьмем пример функциональности заполнения тензорного потока. Он предоставляет два сценария: «Действительный» или «Один и тот же». То же самое сохранит размер выходных данных и оставит их такими же, как и для входных данных, добавив подходящие отступы, в то время как действительный не сделает этого, и некоторые люди утверждают, что это приведет к потере информации, но здесь есть одна проблема ,

Эта потеря информации зависит от размера ядра или используемого вами фильтра. Например, предположим, что у вас есть изображение 28x28, а размер фильтра составляет 15x15 (скажем). Выходные данные должны иметь размерность 16x16, но если вы добавите «same» в тензорном потоке, это будет 28x28. Теперь 12 строк и 12 столбцов сами по себе не несут какой-либо значимой информации, но все еще присутствуют в виде шума. И все мы знаем, насколько восприимчивы модели глубокого обучения к шуму. Это может сильно ухудшить тренировку. Так что, если вы используете большие фильтры, лучше не использовать отступы.

Саурабх Кумар
источник