Site Overlay

O aprendizado da máquina é divertido! Parte 3: Aprendizagem Profunda e Redes Neurais Convolucionais

Podemos treinar este tipo de rede neural em poucos minutos em um laptop moderno. Quando estiver feito, teremos uma rede neural que pode reconhecer imagens de “8” com uma precisão bastante alta. Bem-vindo ao mundo do reconhecimento de imagens (final da década de 1980)!

Tunnel Vision

É realmente puro que simplesmente alimentar uma rede neural com pixels funcionou para construir o reconhecimento de imagens! A aprendizagem da máquina é mágica! …certo?

Bem, é claro que não é assim tão simples.

Primeiro, a boa notícia é que o nosso reconhecimento “8” realmente funciona bem em imagens simples onde a letra está mesmo no meio da imagem:

>

>

Mas agora a notícia realmente má:

O nosso reconhecimento “8” falha totalmente quando a letra não está perfeitamente centrada na imagem. Apenas a menor mudança de posição arruína tudo:

>

Isto porque a nossa rede só aprendeu o padrão de um “8” perfeitamente centrado. Não tem absolutamente nenhuma ideia do que é um “8” fora do centro. Ele conhece exatamente um padrão e apenas um padrão.

Isso não é muito útil no mundo real. Os problemas do mundo real nunca são tão simples e limpos. Então precisamos descobrir como fazer nossa rede neural funcionar em casos onde o “8” não está perfeitamente centrado.

Brute Force Idea #1: Pesquisando com uma janela deslizante

Já criamos um programa muito bom para encontrar um “8” centrado em uma imagem. E se nós apenas procurarmos ao redor da imagem por possíveis “8” em seções menores, uma seção de cada vez, até encontrarmos um?

>

>

Esta abordagem chamada janela deslizante. É a solução de força bruta. Funciona bem em alguns casos limitados, mas é realmente ineficiente. Você tem que verificar a mesma imagem repetidamente procurando por objetos de tamanhos diferentes. Podemos fazer melhor que isso!

Brute Force Idea #2: Mais dados e uma Rede Neural Profunda

Quando treinamos nossa rede, nós só mostramos “8” que estavam perfeitamente centrados. E se a treinamos com mais dados, incluindo “8” em todas as posições e tamanhos diferentes ao redor da imagem?

Não precisamos nem mesmo coletar novos dados de treinamento. Podemos apenas escrever um script para gerar novas imagens com os “8 “s em todos os tipos de posições diferentes na imagem:

>

>

>

Criamos Dados Sintéticos de Treinamento criando diferentes versões das imagens de treinamento que já tínhamos. Esta é uma técnica muito útil!

Utilizando esta técnica, podemos facilmente criar um suprimento infinito de dados de treinamento.

Mais dados tornam o problema mais difícil para a nossa rede neural resolver, mas podemos compensar isso tornando a nossa rede maior e, assim, capaz de aprender padrões mais complicados.

Para tornar a rede maior, nós apenas empilhamos camada sobre camada de nós:

Chamamos isso de “rede neural profunda” porque ela tem mais camadas do que uma rede neural tradicional.

Essa idéia existe desde o final dos anos 60. Mas até recentemente, o treinamento desta grande rede neural era muito lento para ser útil. Mas quando descobrimos como usar placas gráficas 3d (que foram projetadas para fazer multiplicação matricial muito rapidamente) ao invés de processadores de computador normais, trabalhar com grandes redes neurais de repente se tornou prático. Na verdade, a mesma placa de vídeo NVIDIA GeForce GTX 1080 que você usa para jogar Overwatch pode ser usada para treinar redes neurais incrivelmente rápido.

>

Mas mesmo que possamos tornar nossa rede neural realmente grande e treiná-la rapidamente com uma placa gráfica 3d, isso ainda não nos levará a uma solução. Precisamos ser mais inteligentes sobre como processamos imagens em nossa rede neural.

Pense sobre isso. Não faz sentido treinar uma rede para reconhecer um “8” no topo de uma imagem separadamente do treino para reconhecer um “8” no fundo de uma imagem como se fossem dois objectos totalmente diferentes.

Deve haver alguma forma de tornar a rede neural inteligente o suficiente para saber que um “8” em qualquer parte da imagem é a mesma coisa sem todo aquele treino extra. Felizmente… existe!

A solução é Convolução

Como humano, você intuitivamente sabe que as imagens têm uma hierarquia ou estrutura conceitual. Considere esta imagem:

>

Fotos greatuitas do meu filho

Como humano, você reconhece instantaneamente a hierarquia nesta imagem:

  • O chão está coberto de relva e betão
  • Há uma criança
  • A criança está sentada num cavalo saltitante
  • O cavalo saltitante está em cima da relva

Mais importante, reconhecemos a ideia de uma criança, independentemente da superfície em que a criança está. Não temos que reaprender a idéia de criança para cada superfície possível em que ela possa aparecer.

Mas neste momento, nossa rede neural não pode fazer isso. Ela pensa que um “8” em uma parte diferente da imagem é uma coisa totalmente diferente. Ele não entende que mover um objeto na imagem não faz com que seja algo diferente. Isto significa que ele tem que reaprender a identificação de cada objeto em todas as posições possíveis. Isso é uma merda.

Precisamos dar à nossa rede neural a compreensão da invariância da tradução – um “8” é um “8” não importa onde na imagem ele aparece.

Faremos isso usando um processo chamado Convolução. A idéia de convolução é inspirada em parte pela ciência da computação e em parte pela biologia (ou seja, cientistas loucos literalmente cutucando cérebros de gatos com sondas estranhas para descobrir como os gatos processam as imagens).

Como a Convolução Funciona

Em vez de alimentar imagens inteiras em nossa rede neural como uma grade de números, vamos fazer algo muito mais inteligente que tire vantagem da idéia de que um objeto é o mesmo, não importa onde ele apareça em uma imagem.

Aqui está como vai funcionar, passo a passo –

Passo 1: Quebre a imagem em tiles de imagem sobrepostos

Similar à nossa pesquisa de janela deslizante acima, vamos passar uma janela deslizante sobre toda a imagem original e salvar cada resultado como um tile separado e minúsculo da imagem:

>

>

Ao fazer isto, transformamos a nossa imagem original em 77 pequenos azulejos de imagem de igual tamanho.

>

Passo 2: Alimente cada ladrilho de imagem numa pequena rede neural

Anteriormente, alimentámos uma única imagem numa rede neural para ver se era um “8”. Faremos exatamente a mesma coisa aqui, mas o faremos para cada um dos ladrilhos de imagem individual:

Repita isto 77 vezes, uma vez para cada ladrilho.

No entanto, há uma grande reviravolta: Vamos manter os mesmos pesos de rede neural para cada ladrilho na mesma imagem original. Em outras palavras, estamos tratando cada ladrilho de imagem igualmente. Se algo de interessante aparecer em qualquer azulejo, marcaremos esse azulejo como interessante.

Passo 3: Salve os resultados de cada azulejo em um novo array

Não queremos perder a noção da disposição dos azulejos originais. Então salvamos o resultado do processamento de cada ladrilho em uma grade na mesma disposição da imagem original. Parece assim:

Em outras palavras, começamos com uma imagem grande e terminamos com um array um pouco menor que registra quais seções da nossa imagem original foram as mais interessantes.

Passo 4: Amostragem

O resultado do Passo 3 foi um array que mapeia quais partes da imagem original são as mais interessantes. Mas esse array ainda é bem grande:

Para reduzir o tamanho do array, nós o fazemos com um algoritmo chamado max pooling. Parece extravagante, mas não é nada!

Vamos apenas olhar para cada 2×2 quadrados do array e manter o maior número:

A ideia aqui é que se encontrarmos algo interessante em qualquer um dos quatro tiles de entrada que compõem cada quadrado 2×2 do grid, vamos apenas manter o bit mais interessante. Isto reduz o tamanho do nosso array enquanto mantemos os bits mais importantes.

Passo final: Faça uma previsão

Até agora, reduzimos uma imagem gigante para um array bastante pequeno.

Guinhe o quê? Esse array é apenas um monte de números, então nós podemos usar esse pequeno array como entrada em outra rede neural. Esta rede neural final decidirá se a imagem é ou não uma imagem compatível. Para diferenciá-la do passo de convolução, nós a chamamos de uma rede “totalmente conectada”.

Então do começo ao fim, todo o nosso pipeline de cinco passos se parece com isto:

Adicionando ainda mais passos

Nosso pipeline de processamento de imagem é uma série de passos: convolução, max-pooling, e finalmente uma rede totalmente conectada.

Ao resolver problemas no mundo real, estes passos podem ser combinados e empilhados quantas vezes você quiser! Você pode ter duas, três ou até dez camadas de convolução. Você pode adicionar o pooling máximo onde você quiser para reduzir o tamanho dos seus dados.

A idéia básica é começar com uma imagem grande e continuamente fervê-la, passo a passo, até que você finalmente tenha um único resultado. Quanto mais passos de convolução você tiver, mais recursos complicados sua rede será capaz de aprender a reconhecer.

Por exemplo, o primeiro passo de convolução pode aprender a reconhecer arestas vivas, o segundo passo de convolução pode reconhecer bicos usando seu conhecimento de arestas vivas, o terceiro passo pode reconhecer pássaros inteiros usando seu conhecimento de bicos, etc.

Aqui está o que uma rede convolucional profunda mais realista (como você encontraria em um trabalho de pesquisa) se parece:

>

Neste caso, eles iniciam uma imagem de 224 x 224 pixels, aplicam a convolução e o máximo de pooling duas vezes, aplicam a convolução mais 3 vezes, aplicam o máximo de pooling e então têm duas camadas totalmente conectadas. O resultado final é que a imagem é classificada em uma das 1000 categorias!

Construindo a Rede Certa

Como você sabe quais passos você precisa combinar para fazer seu classificador de imagem funcionar?

Honestly, você tem que responder a isso fazendo muita experimentação e testes. Você pode ter que treinar 100 redes antes de encontrar a estrutura e os parâmetros ideais para o problema que você está resolvendo. O aprendizado da máquina envolve muita tentativa e erro!

Building our Bird Classifier

Agora finalmente sabemos o suficiente para escrever um programa que possa decidir se uma imagem é um pássaro ou não.

Como sempre, precisamos de alguns dados para começar. O conjunto de dados gratuito CIFAR10 contém 6.000 fotos de pássaros e 52.000 fotos de coisas que não são pássaros. Mas para obter ainda mais dados vamos também adicionar no conjunto de dados Caltech-UCSD Birds-200-2011 que tem mais 12.000 fotos de pássaros.

Aqui estão algumas das aves do nosso conjunto de dados combinados:

Deixe uma resposta

O seu endereço de email não será publicado.