-
Como uma CNN funciona?
-
Antes de mais nada,
é importante entender
-
como a entrada para esse
tipo de rede é formada,
-
que é, justamente,
a composição de imagem.
-
Aqui, nós temos uma representação
de uma imagem clássica,
-
onde nós temos uma diferença
entre linhas e colunas,
-
uma matriz de linhas e colunas
em três dimensões.
-
Cada dimensão é um canal
de cor dessa imagem,
-
geralmente é vermelho,
verde e azul.
-
Isso compõe a função
RGB de uma imagem.
-
Basicamente, nós temos
pixels que vão de 0 até 255
-
em cada célula dessa imagem,
em cada um dos canais,
-
e a soma deles resulta
na imagem final,
-
na cor final que nós
vemos na tela.
-
Por exemplo, nessa representação,
nós temos o número 8 escrito à mão,
-
então é uma imagem esticadinha
sobre esse número 8 escrito à mão.
-
Nós temos, aqui, a representação
pixel a pixel dessa imagem.
-
O 0 é a cor preta
e o 255 é a cor branca.
-
E existe uma série de variações
desses valores, que são, no caso,
-
uma escala de cinza.
-
E, aqui na terceira parte,
nós temos a matriz de pixels,
-
onde temos o valor de cada
pixel em cada posição.
-
É até possível entender como está
a localização do 8 nessa imagem.
-
Então, para a máquina poder
aprender essa representação,
-
ela tem que aprender
misturas de borda,
-
diferença desses valores
para uma aresta,
-
para uma bolinha aqui de cima,
uma bolinha aqui de baixo,
-
que está compondo a característica
visual do número 8.
-
Então, em uma CNN,
a camada de entrada
-
se conecta diretamente
a cada pixel das imagens.
-
Agora, como ela extrai
características dessas imagens?
-
A operação principal que dá
nome à CNN e a convolução.
-
A convolução é
uma operação matemática
-
que representa a soma
de produto de duas funções.
-
Aqui no caso, uma função
vai ser expressa pelo dado,
-
pela imagem, por exemplo, e outra
função é uma matriz de pesos
-
que está representando a importância
de cada parte da imagem
-
na representação
daquele conteúdo.
-
Vamos entender isso
na próxima imagem.
-
Então, aqui, nós temos
uma representação
-
de uma arquitetura
profunda baseada em CNN.
-
Temos a camada de entrada
e a camada de saída.
-
Essencialmente, a parte
da CNN, de fato,
-
é da camada de entrada
até quase antes da saída,
-
porque é uma parte da rede utilizada
para a extração de features,
-
que são a operação de convolução
sendo passada por cada uma
-
das partes dessa imagem.
-
Essa convolução gera um input
para a próxima camada
-
que faz uma nova convolução
sobre a camada anterior,
-
e assim sucessivamente.
-
O que ele está aprendendo são
representações diretamente da imagem,
-
como arestas, cantos e, depois,
coisas de mais alto nível,
-
como variação de cor,
variação de textura
-
ou, então, combinação de partes
que formam um todo.
-
Então, um olhinho,
um focinho,
-
que representam a cara
de um cachorro,
-
um ponteiro, um número,
-
que representam
a dimensão de um relógio.
-
Quando nós chegamos nas últimas
camadas convolucionais,
-
nós vamos extrair um vetor
com alguma dimensão.
-
Então, por exemplo, 4096,
ou outro número relevante,
-
e isso alimenta uma rede
neural artificial clássica
-
que aprende a distinguir
o que significa esse dado,
-
ou seja, esse vetorzão
de 4000 dimensões
-
representa que tipo
de imagem?
-
Pode ser um cachorro.
-
Esse outro vetor, que representa
uma outra imagem, significa o quê?
-
É um gato, uma flor,
e assim vai,
-
até a máquina conseguir aprender
como distinguir uma imagem da outra.
-
Se o cerne da questão
é uma convolução,
-
é muito importante nós entendermos
como a convolução funciona.
-
Nós podemos entender
uma convolução
-
como uma janela deslizante que está
passando pela imagem de entrada.
-
A primeira convolução
é fácil de ser entendida
-
porque está pegando uma janela
de uma dimensão específica
-
e deslizando pela imagem
como um todo,
-
extraindo informações parciais
de cada parte dessa imagem.
-
Essa imagem resultante,
que não é bem uma imagem,
-
mas algo tridimensional,
-
que representa os pixels
já mastigados,
-
serve de entrada para uma outra
camada convolucional
-
que está passando uma outra
janela deslizante.
-
Cada janela dessa pode
ser um peso diferente
-
que representa a importância
daquela região da imagem
-
para caracterizar o seu
elemento principal,
-
ou seja, a principal classe
presente naquela imagem.
-
Vamos entender o processo
pelo próximo diagrama.
-
Para simplificar, imagine uma imagem
bem pequenininha, de 4 por 5,
-
com alguns valores 0 e 1
que indicam um pixel qualquer.
-
E nós temos, aqui,
uma matriz menor,
-
que apresenta um peso
a ser aprendido,
-
que representa
uma janela 2 por 2.
-
Então, essa janela vai
deslizar pela imagem.
-
Quando nós passamos
pela primeira região,
-
nós vamos multiplicar
os pixels dessa imagem
-
pelo peso dessa matriz,
que representa esse valor "3".
-
Quando eu faço
um passinho por lado,
-
essa multiplicação dessa parte
do pixel pelo peso da matriz
-
representa um outro valor
condensado, que é o 3,
-
e assim sucessivamente.
-
Nós vamos dando
pulinhos nessa janela,
-
ou para a direita ou para baixo,
em todas as dimensões.
-
Quando nós percorrermos
toda a imagem,
-
nós vamos ter uma imagem resultante
que tem essa característica.
-
Se nós queremos plotar
a imagem de entrada,
-
vamos conseguir entender
o seu significado.
-
A imagem de saída
dessa convolução
-
é algo que é difícil de ser
interpretado pelo ser humano,
-
mas a máquina
consegue entender
-
que tem uma informação
relevante para ela.
-
Ou seja, os pixels foram mastigados
para condensar informação importante
-
para caracterizar a qual classe
aquela imagem de entrada pertence.
-
De forma intuitiva, você
pode pensar o seguinte:
-
se a minha janela
for muito pequena
-
e/ou se minha imagem
for muito grande,
-
esse filtro convolucional pode gerar
uma outra matriz muito grande.
-
Ou seja, será que isso
pode não ser eficiente
-
para representar
aquele conteúdo?
-
Muito provavelmente,
não será tão eficiente,
-
portanto, outra operação tão
importante quanto a convolução
-
é o pooling.
-
O pooling representa
uma sumarização
-
de uma parte dessa imagem
resultante, digamos assim.
-
Então, essa região representada
por esse quadrado em vermelho,
-
pode ser sumarizada pelo pixel
mais importante que essa região,
-
por exemplo, o seu
maior valor, o número 3.
-
Quando eu pego
essa outra região aqui,
-
o maior valor
desse pixel é o 1,
-
dessa outra região,
o maior valor é o 2,
-
e dessa outra região,
o maior valor presente é 1.
-
Portanto, aquela imagem
que entrou de 3 por 4
-
ficou reduzida em uma imagem,
ou melhor, uma matriz de 2 por 2.
-
Esse é apenas um dos tipos
de pooling que existem,
-
que é o max pooling.
-
Nós podemos trabalhar também
com o average pooling, ou seja,
-
todos aqueles pixels
daquela região,
-
nós fazemos a média deles
e levamos essa média adiante.
-
Agora que a primeira convolução
e o pooling foram aplicados,
-
essa matriz resultante
serve de entrada
-
para a próxima operação
de convolução,
-
e depois um pooling, e depois outra
convolução, e depois um pooling.
-
Ou então outros arranjos, como
diversas convolução sucessivas,
-
terminando em uma operação
de pooling.
-
Ou seja, tem uma regra para construir
a sua arquitetura própria de CNN?
-
Sim e não: a regra é utilizar
convoluções e pooling,
-
mas o encadeamento entre
elas pode ser uma definição
-
que você vai montar na sua
própria arquitetura.
-
No entanto, existem outras
configurações que podem ser feitas
-
para tornar esse aprendizado
mais robusto, ou seja,
-
tentar aprender mais
nuances dessas imagens,
-
como o padding
e também o striding.
-
O padding está
justamente relacionado
-
a evitar a perda de informação
que está na borda da imagem.
-
Se a imagem original está
aqui nessa região em azul,
-
é naturalmente visível
-
que, quanto mais a janela
está deslizando pela imagem,
-
a informação do centro
tende a ser mais valorizada
-
para extração de features,
-
sendo que a informação que está
na borda tende a ser ignorada.
-
Quando nós
fazemos o padding,
-
estamos colocando como se fossem
pixels falsos em volta da imagem
-
para simular uma imagem
um pouco maior.
-
Assim, a borda
que vai ser perdida,
-
vai ser uma borda que,
de fato, seria irrelevante.
-
Outra estratégia
interessante é o striding,
-
que diz, justamente, o tamanho
do passo da janela deslizante
-
pela imagem.
-
Podemos ter um striding
menor ou maior.
-
E essas são apenas duas
configurações possíveis
-
na montagem de sua arquitetura.
-
Fora isso, você pode pensar quantas
convoluções, quantos poolings,
-
qual a ordem deles também,
-
e outras estratégias que ajudam
a deixar a rede mais especializada,
-
mais rápida ou até mais
específica a um tipo de dado
-
que você queira construir.
-
Com isso, nós podemos ter outros
tipos de redes neurais profundas
-
baseadas em CNN.
-
A partir de uma rede
tradicional, digamos assim,
-
nós podemos ter imagens de outras
características principais,
-
como as que estão
na imagem a seguir.
-
Partindo de uma rede
tradicional, digamos assim,
-
podemos pensar
em uma rede mais ampla,
-
que possui uma janela
de entrada maior,
-
uma rede mais profunda, que possui
mais camadas convolucionais
-
e/ou de pooling, e uma rede
de maior resolução,
-
que está preparada para trabalhar
com imagens de maior resolução,
-
de fato, ou seja,
imagens maiores.
-
Dadas estas e outras
configurações,
-
não é de se admirar
-
que existem diversas
arquiteturas neurais profundas
-
para se trabalhar com CNN.
-
Ou seja, diversas propostas
de redes neurais baseadas em CNN
-
foram surgindo
ao longo do tempo,
-
cada uma com suas caraterísticas
peculiares, por exemplo:
-
se o tamanho da imagem representa
a quantidade de parâmetros
-
a ser aprendido no treinamento,
temos redes muito grandes,
-
muito profundas, redes
não tão profundas assim,
-
redes que possuem um desempenho
muito bom no ImageNet
-
e outras que exigem uma quantidade
muito grande de operações
-
a serem feitas por segundo.
-
Agora, qual dessas arquiteturas
melhor se adequa ao seu problema,
-
depende de uma série
de questões,
-
por exemplo, qual é
o ambiente convolucional
-
onde você vai treinar
e usar as predições ,
-
qual é o conjunto de dados
que você vai utilizar,
-
se é algo mais
específico ou geral,
-
ou até mesmo o tamanho
de dados que você tem
-
para treinar essas redes.
-
Portanto, a melhor saída é
sempre a experimentação.