A operação de convolução, simplificando, é a combinação do produto elemento-elemento de duas matrizes. Contanto que essas duas matrizes concordem em dimensões, não deve haver um problema, e assim eu posso entender a motivação por trás da sua consulta.
A.1 No entanto, a intenção da convolução é codificar a matriz de dados de origem (imagem inteira) em termos de um filtro ou kernel. Mais especificamente, estamos tentando codificar os pixels na vizinhança dos pixels âncora / fonte. Dê uma olhada na figura abaixo:
Normalmente, consideramos cada pixel da imagem de origem como âncora / pixel de origem, mas não somos obrigados a fazer isso. De fato, não é incomum incluir um passo, onde os pixels âncora / fonte são separados por um número específico de pixels.
Ok, então qual é o pixel de origem? É o ponto de ancoragem no qual o kernel está centralizado e estamos codificando todos os pixels vizinhos, incluindo o pixel de ancoragem / origem. Como o kernel é simétrico (não simétrico nos valores do kernel), há um número igual (n) de pixels em todos os lados (4- conectividade) do pixel âncora. Portanto, qualquer que seja esse número de pixels, o comprimento de cada lado do nosso núcleo simétrico é 2 * n + 1 (cada lado da âncora + o pixel da âncora) e, portanto, os filtros / núcleos são sempre de tamanho ímpar.
E se decidíssemos romper com a 'tradição' e usarmos núcleos assimétricos? Você sofreria erros de alias e, portanto, não fazemos isso. Consideramos o pixel a menor entidade, ou seja, não existe um conceito de sub-pixel aqui.
A.2 O problema dos limites é tratado com diferentes abordagens: alguns o ignoram, outros zero, outros refletem o espelho. Se você não deseja calcular uma operação inversa, ou seja, deconvolução, e não está interessado na reconstrução perfeita da imagem original, não se preocupa com a perda de informações ou a injeção de ruído devido ao problema de contorno. Normalmente, a operação de conjunto (conjunto médio ou conjunto máximo) removerá os artefatos de limite de qualquer maneira. Portanto, fique à vontade para ignorar parte do seu 'campo de entrada', sua operação de pool fará isso por você.
-
Zen de convolução:
No domínio de processamento de sinais da velha escola, quando um sinal de entrada era convolvido ou passado através de um filtro, não havia como julgar a priori quais componentes da resposta convolvida / filtrada eram relevantes / informativos e quais não eram. Conseqüentemente, o objetivo era preservar os componentes do sinal (todos) nessas transformações.
Esses componentes de sinal são informações. Alguns componentes são mais informativos que outros. A única razão para isso é que estamos interessados em extrair informações de nível superior; Informação pertinente para algumas classes semânticas. Portanto, os componentes de sinal que não fornecem as informações em que estamos especificamente interessados podem ser removidos. Portanto, diferentemente dos dogmas da velha escola sobre convolução / filtragem, somos livres para agrupar / podar a resposta de convolução como quisermos. A nossa maneira de fazer isso é remover rigorosamente todos os componentes de dados que não estão contribuindo para melhorar nosso modelo estatístico.
1) Suponha que
input_field
seja tudo zero, exceto por uma entrada no índiceidx
. Um tamanho de filtro ímpar retornará dados com um pico centralizadoidx
, um tamanho de filtro uniforme não - considere o caso de um filtro uniforme com tamanho 2. A maioria das pessoas deseja preservar a localização dos picos ao filtrar.2) Tudo isso
input_field
é relevante para a convolução, mas as bordas deoutput_field
não podem ser calculadas com precisão, pois os dados necessários não estão contidosinput_field
. Se eu quiser calcular uma resposta para o primeiro elemento deoutput_field
, o filtro deve estar centrado no primeiro elemento deinput_field
. Mas existem elementos de filtro que não correspondem a nenhum elemento disponível deinput_field
. Existem vários truques para adivinhar as bordas dooutput_field
.fonte
Para um filtro de tamanho ímpar, todos os pixels da camada anterior seriam simétricos ao redor do pixel de saída. Sem essa simetria, teremos que levar em conta distorções nas camadas, o que ocorre quando se usa um kernel de tamanho uniforme. Portanto, filtros de kernel de tamanho uniforme são ignorados principalmente para promover a simplicidade da implementação. Se você pensa em convolução como uma interpolação dos pixels fornecidos para um pixel central, não podemos interpolar para um pixel central usando um filtro de tamanho uniforme.
fonte: https://towardsdatascience.com/deciding-optimal-filter-size-for-cnns-d6f7b56f9363
fonte