Li recentemente Redes totalmente convolucionais para segmentação semântica de Jonathan Long, Evan Shelhamer, Trevor Darrell. Não entendo o que as "camadas desconvolucionais" fazem / como elas funcionam.
A parte relevante é
3.3 Upsampling é convolução para trás
Outra maneira de conectar saídas grosseiras a pixels densos é a interpolação. Por exemplo, a interpolação bilinear simples calcula cada saída das quatro entradas mais próximas por um mapa linear que depende apenas das posições relativas das células de entrada e saída. Em certo sentido, a ampliação do fator f é convolução com um passo de entrada fracionário de 1 / f. Desde que f seja integral, uma maneira natural de aumentar a amostra é, portanto, a convolução reversa (às vezes chamada deconvolução) com um passo de saída de f . Tal operação é trivial de implementar, uma vez que simplesmente inverte os passes de convolução para frente e para trás.
Assim, o upsampling é realizado em rede para aprendizado de ponta a ponta por retropropagação a partir da perda de pixel.
Observe que o filtro de deconvolução em uma camada desse tipo não precisa ser corrigido (por exemplo, para amostragem bilinear), mas pode ser aprendido. Uma pilha de camadas de desconvolução e funções de ativação pode até aprender uma upsampling não linear.
Em nossas experiências, descobrimos que a amostragem na rede é rápida e eficaz para aprender previsões densas. Nossa melhor arquitetura de segmentação usa essas camadas para aprender a fazer um upsample para previsões refinadas na Seção 4.2.
Acho que não entendi como as camadas convolucionais são treinadas.
O que eu acho que entendi é que as camadas convolucionais com um tamanho de núcleo aprendem filtros do tamanho k × k . A saída de uma camada convolucional com tamanho de kernel K , passo s ∈ N e n filtros de dimensão é fraca Entrada. No entanto, não sei como funciona o aprendizado de camadas convolucionais. (Entendo como os MLPs simples aprendem com descida de gradiente, se isso ajudar).
Portanto, se meu entendimento das camadas convolucionais está correto, não tenho idéia de como isso pode ser revertido.
Alguém poderia me ajudar a entender as camadas desconvolucionais?
fonte
Respostas:
Camada de desconvolução é um nome muito infeliz e deveria ser chamada de camada convolucional transposta .
Visualmente, para uma convolução transposta com passo um e sem preenchimento, apenas preenchemos a entrada original (entradas em azul) com zeros (entradas em branco) (Figura 1).
No caso do passo dois e do preenchimento, a convolução transposta ficaria assim (Figura 2):
Você pode encontrar mais (ótimas) visualizações de aritmética convolucional aqui .
fonte
Eu acho que uma maneira de obter uma intuição de nível realmente básico por trás da convolução é que você está deslizando os filtros K, que podem ser considerados K stencils, sobre a imagem de entrada e produzindo ativações K - cada uma representando um grau de correspondência com um estêncil específico . A operação inversa disso seria pegar as ativações de K e expandi-las para uma pré-imagem da operação de convolução. A explicação intuitiva da operação inversa é, portanto, aproximadamente, a reconstrução da imagem, considerando os estênceis (filtros) e as ativações (o grau de correspondência de cada estêncil) e, portanto, no nível intuitivo básico, queremos explodir cada ativação pela máscara do estêncil e adicione-os.
Outra maneira de abordar o entendimento do deconv seria examinar a implementação da camada de deconvolução no Caffe, consulte os seguintes bits de código relevantes:
Você pode ver que ele é implementado no Caffe exatamente como backprop para uma camada convolucional direta regular (para mim, era mais óbvio depois que eu comparei a implementação do backprop na camada conv cuDNN vs ConvolutionLayer :: Backward_gpu implementado usando o GEMM). Portanto, se você trabalhar com o modo como a retropropagação é feita para convolução regular, você entenderá o que acontece no nível da computação mecânica. O modo como esse cálculo funciona corresponde à intuição descrita no primeiro parágrafo deste resumo.
Para responder sua outra pergunta na sua primeira pergunta, há duas diferenças principais entre a propagação traseira do MLP (camada totalmente conectada) e as redes convolucionais:
1) a influência dos pesos está localizada; portanto, primeiro descubra como fazer backprop para, digamos, um filtro 3x3 convoluído com uma pequena área 3x3 de uma imagem de entrada, mapeando para um único ponto na imagem resultante.
2) os pesos dos filtros convolucionais são compartilhados para invariância espacial. O que isso significa na prática é que, na passagem direta, o mesmo filtro 3x3 com os mesmos pesos é arrastado por toda a imagem com os mesmos pesos para que a computação direta produza a imagem de saída (para esse filtro específico). O que isso significa para o backprop é que os gradientes do backprop para cada ponto na imagem de origem são somados em todo o intervalo que arrastamos esse filtro durante a passagem para frente. Observe que também existem gradientes diferentes de perda wrt x, we viés, pois o dLoss / dx precisa ser retropropagado, e o dLoss / dw é como atualizamos os pesos. we viés são entradas independentes no DAG de computação (não há entradas anteriores), portanto não há necessidade de retropropagação nelas.
fonte
Matemática passo a passo, explicando como a transposição da convolução faz o upsampling 2x com filtro 3x3 e passo de 2:
O trecho mais simples do TensorFlow para validar a matemática:
fonte
As notas que acompanham a classe CS231n de Stanford CS : Redes neurais convolucionais para reconhecimento visual, de Andrej Karpathy , fazem um excelente trabalho na explicação de redes neurais convolucionais.
A leitura deste documento deve fornecer uma idéia aproximada sobre:
Esses slides são ótimos para as redes deconvolucionais.
fonte
Acabei de encontrar um ótimo artigo no site da theaon sobre este tópico [1]:
Portanto, em linguagem simples, uma "convolução transposta" é uma operação matemática usando matrizes (como a convolução), mas é mais eficiente que a operação de convolução normal no caso em que você deseja voltar dos valores convoluídos para o original (direção oposta). É por isso que é preferível nas implementações a convolução ao computar na direção oposta (ou seja, para evitar muitas multiplicações 0 desnecessárias causadas pela matriz esparsa que resulta do preenchimento da entrada).
Image ---> convolution ---> Result
Result ---> transposed convolution ---> "originalish Image"
Às vezes, você salva alguns valores no caminho da convolução e reutiliza essas informações ao "voltar":
Result ---> transposed convolution ---> Image
Essa é provavelmente a razão pela qual é chamada erroneamente de "deconvolução". No entanto, tem algo a ver com a transposição da matriz da convolução (C ^ T), daí o nome mais apropriado "convolução transposta".
Portanto, faz muito sentido ao considerar o custo da computação. Você pagaria muito mais pelo Amazon Gpus se não usasse a convolução transposta.
Leia e assista as animações aqui com atenção: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#no-zero-padding-unit-strides-transposed
Algumas outras leituras relevantes:
Eu também sou novo nisso e ficaria grato por quaisquer comentários ou correções.
[1] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html
[2] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic
[3] https://en.wikipedia.org/wiki/Matched_filter
fonte
Poderíamos usar o PCA para analogia.
Ao usar conv, a passagem direta é extrair os coeficientes dos componentes principais da imagem de entrada, e a passagem traseira (que atualiza a entrada) é usar (o gradiente) os coeficientes para reconstruir uma nova imagem de entrada, nova imagem de entrada possui coeficientes de PC que melhor correspondem aos coeficientes desejados.
Ao usar deconv, o passe para frente e para trás são revertidos. O passe para frente tenta reconstruir uma imagem a partir dos coeficientes do PC, e o passo para trás atualiza os coeficientes do PC dados (o gradiente) da imagem.
O passo de deconv forward faz exatamente o cálculo do gradiente de convenção fornecido neste post: http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/
É por isso que, na implementação caffe do deconv (consulte a resposta de Andrei Pokrovsky), o passe de deconv chama backward_cpu_gemm () e o passe de retorno chama forward_cpu_gemm ().
fonte
Além da resposta de David Dao: Também é possível pensar o contrário. Em vez de focar em quais pixels de entrada (baixa resolução) são usados para produzir um único pixel de saída, você também pode focar em quais pixels de entrada individuais contribuem para qual região dos pixels de saída.
Isso é feito nesta publicação destilada , incluindo uma série de visualizações muito intuitivas e interativas. Uma vantagem de pensar nessa direção é que é fácil explicar os artefatos do tabuleiro de damas.
fonte
Convoluções da perspectiva do DSP
Estou um pouco atrasado para isso, mas ainda gostaria de compartilhar minha perspectiva e idéias. Minha formação é em física teórica e processamento de sinais digitais. Em particular, estudei wavelets e convolutions estão quase na minha espinha dorsal;)
O modo como as pessoas da comunidade de aprendizado profundo falam sobre convoluções também foi confuso para mim. Na minha perspectiva, o que parece estar faltando é uma separação adequada de preocupações. Vou explicar as convoluções de aprendizado profundo usando algumas ferramentas DSP.
aviso Legal
Minhas explicações serão um pouco onduladas e não serão rigorosas em termos matemáticos, a fim de esclarecer os principais pontos.
Definições
e
Convoluções de Deep Learning por peças
Como se pode ver, é a operação transposta, portanto, o nome.
Conexão com o Upsampling de vizinho mais próximo
ou seja, podemos substituir um upsampler repetido pelo fator 2 e uma convolução com um núcleo de tamanho 3 por uma convolução transposta com tamanho de núcleo 4. Essa convolução transposta tem a mesma "capacidade de interpolação", mas seria capaz de aprender melhor interpolações correspondentes.
Conclusões e considerações finais
Espero poder esclarecer algumas convoluções comuns encontradas no aprendizado profundo, desmembrando-as nas operações fundamentais.
Eu não cobri piscina aqui. Mas este é apenas um downsampler não linear e também pode ser tratado nessa notação.
fonte
Eu tive muitos problemas para entender o que exatamente aconteceu no artigo até me deparar com esta postagem do blog: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation -com-tensorflow-e-tf-slim /
Aqui está um resumo de como eu entendo o que está acontecendo em uma upsampling 2x:
Informações do papel
Exemplo simples
fonte
O artigo a seguir discute as camadas desconvolucionais. Do ponto de vista da arquitetura e do treinamento. Redes desconvolucionais
fonte