Архитектура AlexNet использует заполнение нулями, как показано на рисунке: Однако в статье нет объяснения, почему вводится это заполнение.
Курс Standford CS 231n учит, что мы используем отступы для сохранения пространственного размера:
Мне интересно, это единственная причина, по которой нам нужно набивать? Я имею в виду, если мне не нужно сохранять пространственный размер, я могу просто удалить отступы? Я знаю, что это приведет к очень быстрому уменьшению пространственных размеров при переходе на более глубокие уровни. Тем не менее, я могу компромисс, удалив пул слоев. Я был бы очень рад, если бы кто-нибудь мог дать мне какое-то обоснование для заполнения нулями. Благодарность!
источник
Мне кажется, самая важная причина - сохранить пространственные размеры. Как вы сказали, мы можем компенсировать уменьшение пространственного размера, удаляя пулы слоев. Однако многие недавние сетевые структуры (такие как остаточные сети , начальные сети , фрактальные сети ) работают на выходах разных слоев, что требует согласованного пространственного размера между ними.
Другое дело, что если заполнение отсутствует, пиксели в углу ввода влияют только на пиксели в соответствующем углу вывода, в то время как пиксели в центре вносят вклад в соседство в выводе. Когда несколько слоев без заполнения объединяются вместе, сеть как бы игнорирует граничные пиксели изображения.
Просто некоторые из моих пониманий, я считаю, что есть и другие веские причины.
источник
Отличный вопрос Drag0 хорошо объяснил, но я согласен, что-то не так.
Это как смотреть на фотографию и иметь дело с границей. В реальной жизни вы можете двигать глазами, чтобы смотреть дальше; Никаких реальных границ не существует. Так что это ограничение среды.
Помимо сохранения размера, это имеет значение? Я не знаю удовлетворительного ответа, но я предполагаю (бездоказательно), что при экспериментах с вниманием и окклюзией (частичные объекты) нам не нужна информация, потерянная на границах. Если бы вы сделали что-то умнее (скажем, скопируйте пиксель рядом с ним), это не изменило бы ответ, хотя я сам не экспериментировал. Заполнение нулями происходит быстро и сохраняет размер, поэтому мы делаем это.
источник
это мое мышление. Заполнение нулями важно в начальный момент времени для сохранения размера вектора выходного объекта. а кто-то выше сказал, что заполнение нулями имеет большую производительность.
а как насчет в прошлый раз? векторное разрешение изображения очень мало, а значение пикселя означает вектор некоторого глобального размера.
Я думаю, что в последнем случае какое-то отражение лучше, чем заполнение нулями.
источник
При разработке информации на границе, в основном, пиксель в углу (заштрихованный зеленым цветом), когда свёртка сделана, будет использоваться только один раз, тогда как посередине, как заштрихованный красный, будет многократно вносить вклад в получившуюся карту объектов. Подкладываем изображение См. рисунок: 2 .
источник
Я постараюсь на основании информации сказать, когда можно начинать, а когда нет.
Давайте для базового случая возьмем пример функциональности заполнения тензорного потока. Он предоставляет два сценария: «Действительный» или «Один и тот же». То же самое сохранит размер выходных данных и оставит их такими же, как и для входных данных, добавив подходящие отступы, в то время как действительный не сделает этого, и некоторые люди утверждают, что это приведет к потере информации, но здесь есть одна проблема ,
Эта потеря информации зависит от размера ядра или используемого вами фильтра. Например, предположим, что у вас есть изображение 28x28, а размер фильтра составляет 15x15 (скажем). Выходные данные должны иметь размерность 16x16, но если вы добавите «same» в тензорном потоке, это будет 28x28. Теперь 12 строк и 12 столбцов сами по себе не несут какой-либо значимой информации, но все еще присутствуют в виде шума. И все мы знаем, насколько восприимчивы модели глубокого обучения к шуму. Это может сильно ухудшить тренировку. Так что, если вы используете большие фильтры, лучше не использовать отступы.
источник