В чем разница между «SAME» и «ДЕЙСТВИТЕЛЬНО» обивкой в tf.nn.max_pool
из tensorflow
?
По моему мнению, «VALID» означает, что после краев не будет нуля.
Согласно Руководству по арифметике свертки для глубокого обучения , в нем говорится, что в операторе пула не будет заполнения, т.е. просто используйте 'VALID' of tensorflow
. Но что такое «ТАКОЕ ЖЕ» заполнение максимального пула tensorflow
?
python
tensorflow
deep-learning
karl_TUM
источник
источник
Ответы:
Я приведу пример, чтобы прояснить это:
x
: входное изображение формы [2, 3], 1 каналvalid_pad
: максимальный пул с ядром 2x2, шаг 2 и VALID.same_pad
: максимальный пул с ядром 2x2, шагом 2 и ЖЕ ЗАПОЛНЕНИЕМ (это классический путь)Выходные формы:
valid_pad
: здесь нет отступов, поэтому выходная форма равна [1, 1]same_pad
: здесь мы дополняем изображение до фигуры [2, 4] (с-inf
последующим применением максимального пула, а затем применяем максимальный пул), поэтому выходная форма равна [1, 2]источник
Если тебе нравится ascii art:
"VALID"
= без дополнения:"SAME"
= с нулевым заполнением:В этом примере:
Ноты:
"VALID"
только когда-либо удаляет самые правые столбцы (или самые нижние строки)."SAME"
пытается равномерно заполнить левую и правую части, но если количество столбцов, которые будут добавлены, будет нечетным, будет добавлен дополнительный столбец справа, как в случае с этим примером (та же логика применяется вертикально: может быть дополнительная строка нулей внизу).Редактировать :
О названии:
"SAME"
отступом, если вы используете шаг 1, выходы слоя будут иметь те же пространственные измерения, что и входы."VALID"
отступом нет «готовых» вводов заполнения. Слой использует только правильные входные данные.источник
-inf
.Когда
stride
1 (более типично для свертки, чем для объединения), мы можем подумать о следующем различии:"SAME"
: размер вывода совпадает с размером ввода. Для этого необходимо, чтобы окно фильтра проскользнуло за пределы входной карты, следовательно, необходимо заполнить его."VALID"
: Окно фильтра остается в допустимой позиции внутри входной карты, поэтому размер вывода уменьшается наfilter_size - 1
. Заполнение не происходит.источник
SAME
и сVALID
таким же успехом можно было назватьfoo
иbar
TensorFlow Свертка пример дает представление о разнице между
SAME
иVALID
:Для
SAME
отступа высота и ширина вывода вычисляются как:И
Для
VALID
отступа высота и ширина вывода вычисляются как:источник
Заполнение - это операция для увеличения размера входных данных. В случае одномерных данных вы просто добавляете / добавляете массив к константе, в 2-мерной матрице вы окружаете эти константы. В n-dim вы окружаете свой гиперкуб n-dim константой. В большинстве случаев эта константа равна нулю и называется заполнением нулями.
Вот пример заполнения нулями с
p=1
применением к 2-му тензору:Вы можете использовать произвольное заполнение для своего ядра, но некоторые из значений заполнения используются чаще, чем другие:
k
k
этот отступ равенk - 1
.Чтобы использовать произвольный отступ в TF, вы можете использовать
tf.pad()
источник
Быстрое объяснение
VALID
: Не применять какие-либо отступы, т. Е. Предполагать, что все размеры действительны, так что входное изображение полностью покрывается фильтром и соответствует заданному вами шагу.SAME
: Примените отступы к входным данным (если необходимо), чтобы входное изображение полностью покрывалось фильтром и шагом, который вы указали. Для шага 1 это будет гарантировать, что размер выходного изображения совпадает с размером ввода.Ноты
NO_PADDING
вместо этого.AUTO_PADDING
вместо этого.SAME
(то есть режиме автозаполнения) Tensorflow будет пытаться равномерно распределить отступы как слева, так и справа.VALID
(т. Е. Без режима заполнения) Tensorflow будет отбрасывать правую и / или нижнюю ячейки, если ваш фильтр и шаг не полностью покрывают входное изображение.источник
Я цитирую этот ответ в официальных документах тензорного потока https://www.tensorflow.org/api_guides/python/nn#Convolution. Для «ОДНОГО» заполнения высота и ширина вывода вычисляются следующим образом:
и отступы сверху и слева вычисляются как:
Для заполнения 'VALID' высота и ширина вывода вычисляются как:
и значения заполнения всегда равны нулю.
источник
Существует три варианта заполнения: действительный (без заполнения), одинаковый (или наполовину), полный. Вы можете найти объяснения (в Theano) здесь: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
Допустимое заполнение не включает в себя заполнение нулями, поэтому оно охватывает только действительный ввод, не включая искусственно сгенерированные нули. Длина вывода равна ((длина ввода) - (k-1)) для размера ядра k, если шаг s = 1.
При одинаковом заполнении размер выходных данных совпадает с размером входных данных при s = 1. Если s = 1, число дополняемых нулей равно (k-1).
Полное заполнение означает, что ядро работает над целыми входами, поэтому в конце ядро может встретить только один вход и нули в другом. Число дополняемых нулей равно 2 (k-1), если s = 1. Длина вывода равна ((длина ввода) + (k-1)), если s = 1.
Следовательно, количество отступов: (действительное) <= (одинаковое) <= (полное)
источник
Заполнение вкл / выкл. Определяет эффективный размер вашего ввода.
VALID:
Нет дополнения. Операции свертки и т. Д. Выполняются только в «допустимых» местах, т.е. не слишком близко к границам вашего тензора.С ядром 3x3 и изображением 10x10 вы будете выполнять свертку в области 8x8 внутри границ.
SAME:
Обивка предоставляется. Всякий раз, когда ваша операция ссылается на окрестность (независимо от ее размера), нулевые значения предоставляются, когда эта окрестность выходит за пределы исходного тензора, чтобы эта операция могла работать и с граничными значениями.С ядром 3x3 и изображением 10x10 вы будете выполнять свертку на всей площади 10x10.
источник
VALID padding: это с нулевым заполнением. Надеюсь, что нет путаницы.
ТО ЖЕ ВРЕМЯ: Это довольно сложно понять, во-первых, потому что мы должны рассматривать два условия отдельно, как указано в официальных документах .
Давайте возьмем ввод как , вывод как , заполнение как , шаг как и размер ядра как (рассматривается только одно измерение)
Дело 01 :
Дело 02 :
рассчитывается таким образом, чтобы минимальное значение, которое может быть принято для заполнения. Поскольку значение известно, значение можно найти с помощью этой формулы .
Давайте разберем этот пример:
Здесь размерность х равна (3,4). Тогда, если взять горизонтальное направление (3):
Если вертикальное направление принято (4):
Надеюсь, что это поможет понять, как на самом деле работает то же самое в TF.
источник
Основываясь на объяснениях здесь и следуя ответу Тристана, я обычно использую эти быстрые функции для проверки работоспособности.
источник
Подводя итог, «действительный» отступ означает отсутствие заполнения. Размер вывода сверточного слоя уменьшается в зависимости от размера ввода и размера ядра.
Напротив, «одно и то же» заполнение означает использование заполнения. Когда для шага установлено значение 1, выходной размер сверточного слоя сохраняется в качестве входного размера, добавляя определенное количество «0-границы» вокруг входных данных при вычислении свертки.
Надеюсь, это интуитивное описание поможет.
источник
Здесь W и H - ширина и высота ввода, F - размеры фильтра, P - размер заполнения (т. Е. Количество строк или столбцов, которые должны быть дополнены).
Для ТО ЖЕ САМОГО дополнения:
Для VALID дополнения:
источник
В дополнение к прекрасному ответу Ивсегерея, я нашел эту визуализацию чрезвычайно полезной:
Заполнение ' valid ' является первой цифрой. Окно фильтра остается внутри изображения.
Заполнение "то же самое " является третьей цифрой. Выход такой же размер.
Нашел это по этой статье .
источник
Ответ, совместимый с Tensorflow 2.0 : выше были предоставлены подробные объяснения о «допустимых» и «одинаковых» отступах.
Тем не менее, я буду указывать различные функции объединения и их соответствующие команды в
Tensorflow 2.x (>= 2.0)
интересах сообщества.Функции в 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Функции в 2.x :
tf.nn.max_pool
если используется в 2.x иtf.compat.v1.nn.max_pool_v2
илиtf.compat.v2.nn.max_pool
, если мигрировал с 1.x на 2.x.tf.keras.layers.MaxPool2D
если используется в 2.x иtf.compat.v1.keras.layers.MaxPool2D
илиtf.compat.v1.keras.layers.MaxPooling2D
илиtf.compat.v2.keras.layers.MaxPool2D
илиtf.compat.v2.keras.layers.MaxPooling2D
, если мигрировал с 1.x на 2.x.Average Pooling => tf.nn.avg_pool2d
илиtf.keras.layers.AveragePooling2D
если используется в TF 2.x иtf.compat.v1.nn.avg_pool_v2
илиtf.compat.v2.nn.avg_pool
илиtf.compat.v1.keras.layers.AveragePooling2D
илиtf.compat.v1.keras.layers.AvgPool2D
илиtf.compat.v2.keras.layers.AveragePooling2D
илиtf.compat.v2.keras.layers.AvgPool2D
, если мигрировал с 1.x на 2.x.Для получения дополнительной информации о миграции с Tensorflow 1.x на 2.x, пожалуйста, обратитесь к этому Руководству по миграции .
источник