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


19

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

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

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

Ответы:


20

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

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

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

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

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

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

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


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

3

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

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

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


2

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

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

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


1

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

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

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


1

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


1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.