Qual é a diferença entre o preenchimento 'SAME' e 'VALID' em tf.nn.max_pool
of tensorflow
?
Na minha opinião, 'VÁLIDO' significa que não haverá preenchimento zero fora das bordas quando fazemos o pool máximo.
De acordo com um guia de aritmética de convolução para aprendizado profundo , ele diz que não haverá preenchimento no operador de pool, ou seja, basta usar 'VALID' de tensorflow
. Mas qual é o preenchimento 'MESMO' da piscina máxima tensorflow
?
python
tensorflow
deep-learning
karl_TUM
fonte
fonte
Respostas:
Vou dar um exemplo para deixar mais claro:
x
: imagem de entrada da forma [2, 3], 1 canalvalid_pad
: pool máximo com kernel 2x2, stride 2 e preenchimento VÁLIDO.same_pad
: pool máximo com kernel 2x2, stride 2 e SAME padding (este é o caminho clássico a seguir)As formas de saída são:
valid_pad
: aqui, sem preenchimento, portanto a forma de saída é [1, 1]same_pad
: aqui, colocamos a imagem na forma [2, 4] (com-inf
e depois aplicamos o pool máximo), então a forma de saída é [1, 2]fonte
Se você gosta de arte ascii:
"VALID"
= sem preenchimento:"SAME"
= com preenchimento zero:Neste exemplo:
Notas:
"VALID"
apenas remove as colunas mais à direita (ou as linhas mais abaixo)."SAME"
tenta preencher uniformemente esquerda e direita, mas se a quantidade de colunas a ser adicionada for ímpar, ela adicionará a coluna extra à direita, como é o caso neste exemplo (a mesma lógica se aplica verticalmente: pode haver uma linha extra zeros na parte inferior).Editar :
Sobre o nome:
"SAME"
preenchimento, se você usar um passo de 1, as saídas da camada terão as mesmas dimensões espaciais que suas entradas."VALID"
preenchimento, não há entradas de preenchimento "compostas". A camada usa apenas dados de entrada válidos .fonte
-inf
.Quando
stride
é 1 (mais típico de convolução do que de pool), podemos pensar na seguinte distinção:"SAME"
: tamanho da saída é igual ao tamanho da entrada. Isso requer que a janela de filtro deslize para fora do mapa de entrada, daí a necessidade de preenchimento."VALID"
: A janela de filtro permanece na posição válida dentro do mapa de entrada, então o tamanho da saída diminuifilter_size - 1
. Não ocorre preenchimento.fonte
SAME
eVALID
pode ter sido chamadofoo
ebar
O exemplo de convolução do TensorFlow fornece uma visão geral sobre a diferença entre
SAME
eVALID
:Para o
SAME
preenchimento, a altura e a largura da saída são calculadas como:E
Para o
VALID
preenchimento, a altura e a largura da saída são calculadas como:fonte
O preenchimento é uma operação para aumentar o tamanho dos dados de entrada. No caso de dados unidimensionais, você apenas acrescenta / acrescenta o array com uma constante; em 2-dim você envolve a matriz com essas constantes. Em n-dim, você envolve seu hipercubo n-dim com a constante. Na maioria dos casos, essa constante é zero e é chamada de preenchimento zero.
Aqui está um exemplo de preenchimento zero
p=1
aplicado ao tensor 2-d:Você pode usar preenchimento arbitrário para o kernel, mas alguns dos valores de preenchimento são usados com mais frequência do que outros:
k
k
, esse preenchimento é igual ak - 1
.Para usar preenchimento arbitrário no TF, você pode usar
tf.pad()
fonte
Explicação Rápida
VALID
: Não aplique nenhum preenchimento, ou seja, suponha que todas as dimensões sejam válidas para que a imagem de entrada seja totalmente coberta pelo filtro e pela passada especificada.SAME
: Aplique preenchimento à entrada (se necessário) para que a imagem de entrada fique totalmente coberta pelo filtro e passo especificado. No passo 1, isso garantirá que o tamanho da imagem de saída seja o mesmo da entrada.Notas
NO_PADDING
.AUTO_PADDING
.SAME
(modo auto-pad), o Tensorflow tentará espalhar o preenchimento igualmente à esquerda e à direita.VALID
(ou seja, modo sem preenchimento), o Tensorflow deixará cair as células direita e / ou inferior se o filtro e a passada não cobrirem totalmente a imagem de entrada.fonte
Estou citando esta resposta em documentos oficiais do tensorflow https://www.tensorflow.org/api_guides/python/nn#Convolution Para o preenchimento 'SAME', a altura e a largura da saída são calculadas como:
e o preenchimento na parte superior e esquerda são calculados como:
Para o preenchimento 'VALID', a altura e a largura da saída são calculadas como:
e os valores de preenchimento são sempre zero.
fonte
Existem três opções de preenchimento: válido (sem preenchimento), igual (ou metade), completo. Você pode encontrar explicações (em Theano) aqui: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
O preenchimento válido não envolve preenchimento zero, portanto, abrange apenas a entrada válida, sem incluir zeros gerados artificialmente. O comprimento da saída é ((o comprimento da entrada) - (k-1)) para o tamanho do kernel k, se o passo s = 1.
O mesmo preenchimento torna o tamanho das saídas igual ao das entradas quando s = 1. Se s = 1, o número de zeros preenchidos é (k-1).
O preenchimento completo significa que o kernel roda sobre as entradas inteiras; portanto, nas extremidades, o kernel pode atender à única entrada e zeros a mais. O número de zeros preenchidos é 2 (k-1) se s = 1. O comprimento da saída é ((o comprimento da entrada) + (k-1)) se s = 1.
Portanto, o número de preenchimentos: (válido) <= (mesmo) <= (completo)
fonte
Preenchimento on / off. Determina o tamanho efetivo da sua entrada.
VALID:
Sem preenchimento. As operações de convolução etc. são realizadas apenas em locais "válidos", ou seja, não muito próximos das bordas do seu tensor.Com um núcleo de 3x3 e uma imagem de 10x10, você estaria realizando a convolução na área 8x8 dentro das bordas.
SAME:
O estofamento é fornecido. Sempre que sua operação faz referência a uma vizinhança (não importa o tamanho), valores zero são fornecidos quando essa vizinhança se estende para fora do tensor original para permitir que essa operação funcione também nos valores de borda.Com um kernel de 3x3 e uma imagem de 10x10, você estaria realizando convolução em toda a área de 10x10.
fonte
Preenchimento VÁLIDO : este é com preenchimento zero. Espero que não haja confusão.
MESMO preenchimento: isso é meio complicado de entender, porque precisamos considerar duas condições separadamente, conforme mencionado nos documentos oficiais .
Vamos considerar entrada como , saída como , preenchimento como , passo como e tamanho do kernel como (apenas uma única dimensão é considerada)
Caso 01 ::
Caso 02 ::
é calculado de modo que o valor mínimo que pode ser obtido para o preenchimento. Como o valor de é conhecido, o valor de pode ser encontrado usando esta fórmula .
Vamos elaborar este exemplo:
Aqui a dimensão de x é (3,4). Então, se a direção horizontal for tomada (3):
Se a direção vertical for tomada (4):
Espero que isso ajude a entender como realmente o MESMO preenchimento funciona no TF.
fonte
Com base na explicação aqui e no acompanhamento da resposta de Tristan, costumo usar essas funções rápidas para verificações de sanidade.
fonte
Resumindo, preenchimento 'válido' significa sem preenchimento. O tamanho da saída da camada convolucional diminui dependendo do tamanho da entrada e do tamanho do kernel.
Pelo contrário, estofamento 'mesmo' significa usar estofamento. Quando o passo é definido como 1, o tamanho da saída da camada convolucional mantém o tamanho da entrada, acrescentando um certo número de 'borda 0' ao redor dos dados de entrada ao calcular a convolução.
Espero que esta descrição intuitiva ajude.
fonte
Aqui, W e H são largura e altura da entrada, F são dimensões do filtro, P é tamanho do preenchimento (ou seja, número de linhas ou colunas a serem preenchidas)
Para o MESMO preenchimento:
Para preenchimento VÁLIDO:
fonte
Complementando a excelente resposta de YvesgereY, achei esta visualização extremamente útil:
O preenchimento ' válido ' é a primeira figura. A janela de filtro permanece dentro da imagem.
Preenchimento ' mesmo ' é a terceira figura. A saída é do mesmo tamanho.
Encontrei neste artigo .
fonte
Resposta compatível com Tensorflow 2.0 : Foram fornecidas explicações detalhadas acima, sobre preenchimento "Válido" e "Mesmo".
No entanto, especificarei diferentes Funções de Pool e seus respectivos Comandos
Tensorflow 2.x (>= 2.0)
, para o benefício da comunidade.Funções no 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Funções no 2.x :
tf.nn.max_pool
Se usado em 2.x etf.compat.v1.nn.max_pool_v2
outf.compat.v2.nn.max_pool
, se migraram de 1.x para 2.xtf.keras.layers.MaxPool2D
se usado em 2.xetf.compat.v1.keras.layers.MaxPool2D
outf.compat.v1.keras.layers.MaxPooling2D
outf.compat.v2.keras.layers.MaxPool2D
outf.compat.v2.keras.layers.MaxPooling2D
, se migrado de 1.x para 2.x.Average Pooling => tf.nn.avg_pool2d
outf.keras.layers.AveragePooling2D
se usado no TF 2.xetf.compat.v1.nn.avg_pool_v2
outf.compat.v2.nn.avg_pool
outf.compat.v1.keras.layers.AveragePooling2D
outf.compat.v1.keras.layers.AvgPool2D
outf.compat.v2.keras.layers.AveragePooling2D
outf.compat.v2.keras.layers.AvgPool2D
, se migrado de 1.x para 2.x.Para obter mais informações sobre migração do Tensorflow 1.x para 2.x, consulte este Guia de migração. .
fonte