Page 13 - Revista_60.pub
P. 13
A PROGRAMAR
ATRAVÉS DOS OLHOS DE UMA REDE NEURONAL
O resultado é uma matriz (feature map), onde se obser- quência para identificar elementos hierárquicos dentro de
va onde o filtro obteve a maior e menor correspondência: outros elementos (por exemplo numa primeira passagem
identifica caras, e numa segunda passagem elementos den-
tro de caras como sendo olhos, nariz, boca, etc.)
Flatten
Transforma os vetores 2D resultantes dos passos
anteriores em vetores 1D, prontos para serem usados como
entrada para uma rede neuronal.
Deverão aplicar-se tantos filtros quantos necessários
para identificar o máximo de features possíveis. Full connection
O resultado desta operação é uma convolution layer, Aplica os valores dos vetores resultante numa rede
composta por vários feature maps, sobre os quais se aplica, a neuronal, composta pelas layers usuais: input, hidden, out-
cada valor, uma função ReLU (Rectifier Linear Unit): f(x) = max put. Uma vez que se trata de uma classificação, a output
(0, x); que altera os negativos para zero, introduzindo um fator layer, terá tantos neurónios como os elementos a classificar,
de não linearidade. neste caso 6, sendo nesta última utilizada a função softmax,
para decidir qual o neurónio que obteve a maior classificação
Assim, se considerarmos preto como negativo, branco e portanto aquela cuja rede decidiu ser o elemento correto.
como positivo e um nível intermédio de cinzento como zero, os
valores do preto até ao zero, são todos alterados para o cin-
zento zero. Implementando
Vamos implementar o algoritmo descrito em Python
3.6, utilizando a biblioteca Keras.
Pooling
De seguida aplica-se um down sampling às feature Começamos por importar as funções necessárias:
maps, que consiste em dividir cada feature map em segmentos
(por exemplo 2x2), e calcular o valor máximo de cada um (no from keras.models import Sequential, load_model
from keras.layers import Conv2D, MaxPooling2D,
caso do max pooling), sendo esse valor usado para gerar os Flatten
pooling feature maps que, como se compreende, são uma ver- from keras.layers import Dense
são reduzida dos originais (pixalizados). Este passo, para além from keras.preprocessing import image
de reduzir o volume de dados para processamento, torna o from keras.preprocessing.image import
ImageDataGenerator
modelo independente de pequenas distorções ou ruído. from numpy import expand_dims, argmax
Introduzimos um conjunto de configuração: largura
(W) e altura (H) das imagens (100x100), dimensão da matriz
dos filtros (3x3), dimensão do downscaling do max pooling
(2x2), caminho relativo para os ficheiros.
imgW, imgH = 100, 100
No exemplo, aplica-se um max pooling de 2x2, reduzin- kernel, downscale = 3, 2
do essa forma o original numa versão reduzida, mas preser- path = 'dataset'
vando os detalhes (features), identificados.
As imagens estão organizadas em pastas entre
training e test set, e posteriormente em classes novamente
pelos nomes das pastas: apple (maça), banana, lime (lima),
orange (laranja), pineapple (ananás), strawberry (morango).
Os dois passos anteriores (Convolution + ReLU,
Pooling), podem ser repetidos mais do que uma vez em se-
13