-
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ópria 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 pulo foi aplicado,
-
essa matriz resultante serve de entrada
para a próxima operação de convolução
-
e depois um pulo e depois outro.
-
Convolução e depois um pulo.
-
Ou então outros arranjos, como diversas
convolução sucessivas.
-
Terminamos em uma operação de público.
-
Ou seja, tem uma regra para construir
essa arquitetura própria de CNN
-
Sim não a regra
para otimizar conversões e pulling,
-
mas o encadeamento entre
-
elas pode ser uma definição que você
vai montar na sua própria criatura.
-
no entanto, existem outras configurações
que podem ser feitas
-
para tornar esse aprendizado mais robusto,
ou se ele tentar aprender
-
mais nuances dessas imagens,
como por exemplo o pede e também o string.
-
O pede está justamente
-
relacionado a evitar a perda de informação
que está na borda da imagem com você.
-
Essa imagem original está aqui
nessa região em azul.
-
É naturalmente visível
que quanto mais a gente está deslizando
-
pela imagem,
-
a informação do centro tende a ser
mais valorizada para essa ação de filtros,
-
sendo que a informação que está na borda
tende a ser ignorada.
-
Quando nós fazemos ou pede, estamos
colocando como se fossem pixels falsos
-
em volta da imagem para simular uma imagem
um pouco maior.
-
Assim, a borda que é perdida
vai ser uma borda
-
que de fato seria irrelevante.
-
Outra estratégia interessante
-
é o sprite, que diz justamente
o tamanho do passo da janela deslizante.
-
Pela imagem podemos pensar menor ou maior.
-
E essas são apenas duas configurações
possíveis na montagem sua arquitetura.
-
Fora isso,
-
você pode pensar quantas convulsões,
quantos pulinhos, qual, além deles também
-
e outros até 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 por exemplo,
as que estão na imagem a seguir.
-
Partindo de uma rede tradicional,
digamos assim, podemos pensar
-
numa rede mais ampla,
que possui uma janela de entrada maior,
-
uma rede mais profunda,
que possui mais camadas convencionais
-
e ou de pool 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 scene.
-
Ou seja, diversas propostas de regionais
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.
-
Eles não tão profundas
assim, redes que possuem um desempenho
-
muito bom na imagem net
e outras que exigem
-
uma quantidade muito grande de operações
serem feitas por segundo.
-
Agora, qual dessa criatura melhor
se adequa ao seu problema?
-
Depende de uma série de questões,
como por exemplo
-
qual é o ambiente funcional
onde você vai treinar?
-
E os aspones?
-
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