Professional Documents
Culture Documents
Capítulo
7
Redes Neurais Convolucionais com Tensorflow:
Teoria e Prática
Abstract
Resumo
7.1. Introdução
As redes neurais convolucionais (ConvNets ou CNNs) se tornaram o novo padrão em vi-
são computacional e são fáceis de treinar quando existe grande quantidade de amostras
rotuladas que representam as diferentes classes-alvo. Algumas das vantagens consistem
em: (a) capacidade de extrair características relevantes através de aprendizado de transfor-
mações (kernels) e (b) depender de menor número de parâmetros de ajustes do que redes
totalmente conectadas com o mesmo número de camadas ocultas. Como cada unidade de
uma camada não é conectada com todas as unidades da camada seguinte, há menos pesos
para serem atualizados, facilitando assim o treinamento.
As Figuras 7.1 e 7.2 apresentam exemplos de como as CNNs podem ser utiliza-
das. Na Figura 7.1, o aplicativo realiza sugestões de palavras relevantes que descrevem o
cenário da imagem, como “ponte”, “via férrea” e “tênis” através de conhecimento sinteti-
zado via CNNs. A Figura 7.2 mostra exemplos de uma CNN usada para reconhecimento
de objetos, pessoas e animais em imagens do dia a dia.
Figura 7.1: Exemplos de sugestões de palavras relevantes que descrevem a cena feita por
uma ConvNet. Figura modificada de [Clarifai 2017]
Figura 7.2: Exemplos de reconhecimento de objetos, pessoas e animais feitos por uma
ConvNet. Modificado de [Ren et al. 2015].
Figura 7.3: Ilustração da arquitetura de uma LeNet que classifica imagens de entradas
em célula anormal ou célula normal e suas três principais camadas: convolucionais, de
pooling e totalmente conectadas.
As CNNs são formadas por sequências de camadas e cada uma destas possui uma
função específica na propagação do sinal de entrada. A Figura 7.3 ilustra a arquitetura
de uma LeNet e suas três principais camadas: convolucionais, de pooling e totalmente
conectadas. As camadas convolucionais são responsáveis por extrair atributos dos volu-
mes de entradas. As camadas de pooling são responsáveis por reduzir a dimensionalidade
do volume resultante após as camadas convolucionais e ajudam a tornar a representação
invariante a pequenas translações na entrada. As camadas totalmente conectadas são res-
ponsáveis pela propagação do sinal por meio da multiplicação ponto a ponto e o uso de
uma função de ativação. A saída da CNN é a probabilidade da imagem de entrada perten-
cer a uma das classes para qual a rede foi treinada. Na seção seguinte, detalhamos o que
ocorre em cada uma dessas camadas.
1 https://research.google.com/teams/brain/
7.2.1. Camada Convolucional
As camadas convolucionais consistem de um conjunto de filtros que recebem como en-
trada um arranjo 3D, também chamado de volume. Cada filtro possui dimensão reduzida,
porém ele se estende por toda a profundidade do volume de entrada. Por exemplo, se a
imagem for colorida, então ela possui 3 canais e o filtro da primeira camada convolucional
terá tamanho 5x5x3 (5 pixels de altura e largura, e profundidade igual a 3). Automati-
camente, durante o processo de treinamento da rede, esses filtros são ajustados para que
sejam ativados em presença de características relevantes identificadas no volume de en-
trada, como orientação de bordas ou manchas de cores [Karpathy 2017]. A relevância é
avaliada de tal forma que os resultados sejam optimizados em função de um conjunto de
amostras previamente classificadas.
Cada um desses filtros dá origem a uma estrutura conectada localmente que per-
corre toda a extensão do volume de entrada. A somatória do produto ponto a ponto entre
os valores de um filtro e cada posição do volume de entrada é uma operação conhecida
como convolução, a qual é ilustrada na Figura 7.4. Os valores resultantes após a operação
de convolução passam por uma função de ativação, e a mais comum é a função ReLU
(Rectified Linear Units) [Krizhevsky et al. 2012]. Essa função pode ser calculada pela
Equação 1.
Com isso, é possível computar a altura (AC) e a largura (LC) do volume resultante
de uma camada convolucional utilizando as Equações 2 e 3, respectivamente.
A − F + 2P
AC = + 1, (2)
S
L − F + 2P
LC = + 1, (3)
S
em que A e L correspondem, respectivamente, a altura e largura do volume de entrada, F
é o tamanho dos filtros utilizados, S é o valor do passo, e P é o valor do zero-padding.
7.2.2. Camada de Pooling
Após uma camada convolucional, geralmente existe uma camada de pooling. O obje-
tivo dessa camada é reduzir progressivamente a dimensão espacial do volume de en-
trada, consequentemente a redução diminui o custo computacional da rede e evita over-
fitting [Karpathy 2017]. Na operação de pooling, os valores pertencentes a uma deter-
minada região do mapa de atributos, gerados pelas camadas convolucionais, são substi-
tuídos por alguma métrica dessa região. A forma mais comum de pooling consiste em
substituir os valores de uma região pelo valor máximo [Goodfellow et al. 2016], como
ilustra a Figura 7.6. Essa operação é conhecida como max pooling e é útil para eliminar
valores desprezíveis, reduzindo a dimensão da representação dos dados e acelerando a
computação necessária para as próximas camadas, além de criar uma invariância a pe-
quenas mudanças e distorções locais. Outras funções de pooling comumente usadas são
a média, a norma L2 e a média ponderada baseada na distância partindo do pixel central
[Aggarwal et al. 2001].
Figura 7.6: Aplicação de max pooling em uma imagem 4x4 utilizando um filtro 2x2.
Além de reduzir o tamanho da imagem, consequentemente reduzindo o processamento
para as próximas camadas, essa técnica também auxilia no tratamento de invariâncias
locais. Modificada de [dos Santos Ferreira 2017].
A−F
AP = + 1, (4)
S
L−F
LP = + 1, (5)
S
onde as variáveis A e L correspondem respectivamente a altura e largura do volume de
entrada, enquanto que F representa o tamanho da janela utilizada, e S é o valor do passo.
Vale destacar que a profundidade do volume de entrada não é alterada pela operação de
pooling.
Figura 7.7: Ilustração da extração de características de uma imagem por uma CNN e sua
posterior classificação.
m
uk = ∑ wk j x j , (6)
j=1
yk = ϕ(uk + bk ), (7)
em que x1 , x2 , ..., xm são os m sinais de entrada, wk1 , wk2 e wkm são os pesos sinápticos do
neurônio k, e bk corresponde ao viés ou bias, responsável por realizar o deslocamento da
função de ativação definida por ϕ(.).
Como mencionado anteriormente, a última camada da rede utiliza softmax como
função de ativação. Essa função recebe um vetor de valores como entrada e produz a
distribuição probabilística da imagem de entrada pertencer a cada umas das classes na
qual a rede foi treinada. Vale destacar que a soma de todas as probabilidades é igual a 1.
Uma técnica conhecida como dropout [Goodfellow et al. 2016] também é bas-
tante utilizada entre as camadas totalmente conectadas para reduzir o tempo de trei-
namento e evitar overfitting. Essa técnica consiste em remover, aleatoriamente a cada
iteração de treinamento, uma determinada porcentagem dos neurônios de uma camada,
readicionando-os na iteração seguinte. Essa técnica também confere à rede a habilidade
de aprender atributos mais robustos, uma vez que um neurônio não pode depender da
presença específica de outros neurônios.
• Passo 1: Todos os filtros e pesos da rede são inicializados com valores aleatórios;
• Passo 2: A rede recebe uma imagem de treino como entrada e realiza o processo de
propagação (convoluções, ReLU e pooling, e processo de propagação nas camadas
totalmente conectadas). Após esse processo a rede obtém um valor de probabilidade
para cada classe.
tamanho 1x1, 3x3 e 5x5. A grande vantagem do módulo Inception era o uso da convo-
lução com filtros 1x1 para reduzir o número de características no bloco paralelo antes de
realizar as convoluções com os filtros maiores.
GoogLeNet foi o primeiro modelo que introduziu a ideia de que as camadas das
CNNs não precisavam ser executadas sequencialmente. A sequência de módulos In-
ception mostraram que uma estrutura criativa de camadas pode melhorar o desempenho
da rede e diminuir o custo computacional. No ano seguinte, a rede conhecida como
Inception-v4 [Szegedy et al. 2016], que consistia de alguns melhoramentos da GoogLe-
Net, alcançou um top-5 erro de 3,08%.
7.3.5. Microsoft e ResNet (2015)
A rede ResNet [He et al. 2016] foi proposta por pesquisadores da Microsoft e venceu o
ILSVRC 2015 com top-5 erro de 3.6%. O desempenho dessa rede foi superior ao de seres
humanos, que dependendo de suas habilidades e área de conhecimento, normalmente
obtém top-5 erro entre 5 e 10%.
A ResNet era composta por 152 camadas e formada por blocos residuais (Residual
Blocks). A ideia por trás dos blocos residuais é que uma entrada x passa por uma série de
operações de convolução-relu-convolução. O resultado da operação F(x) é adicionado à
entrada original x, como mostra a Equação 8 e como ilustrado na Figura 7.12.
exame, as imagens das células coletadas são analisadas por um citologista e este tenta
encontrar células anormais. As principais anormalidades são identificadas pela análise
das características de forma e textura do núcleo e do citoplasma das células. A automa-
ção do exame do Papanicolau pode ser feita pelo uso de técnicas de processamento de
imagens para a identificação de células anormais. Nesse sentido, utilizaremos uma CNN
para a classificação de imagens de células cervicais em normal ou anormal. A Figura 7.13
mostra exemplos de células normais e anormais.
7
’ ’ ’ w e i g h t _ v a r i a b l e ( shape )
9 − A e n t r a d a d e s s a f u n ç ã o é uma l i s t a no f o r m a t o [ b a t c h , a l t u r a , l a r g u r a ,
p r o f u n d i d a d e ] , na q u a l b a t c h r e p r e s e n t a o n ú mero de i m a g e n s
p r o c e s s a d a s de uma v e z . A l t u r a , l a r g u r a e p r o f u n d i d a d e r e p r e s e n t a m
a s d i m e n s õ e s do volume de e n t r a d a .
11 − O r e t o r n o d e s s a f u n ç ã o s ã o o s v a l o r e s de p e s o s i n i c i a l i z a d o s de
m a n e i r a a l e a t ó r i a s e g u i n d o uma d i s t r i b u i ç ã o n o r m a l com d e s v i o
padr ão 0 . 1 .
’’’
13 def w e i g h t _ v a r i a b l e ( shape ) :
i n i t i a l = t f . t r u n c a t e d _ n o r m a l ( shape , s t d d e v = 0 . 1 )
15 return t f . Variable ( i n i t i a l )
17 ’ ’ ’ b i a s _ v a r i a b l e ( shape )
− A e n t r a d a d e s s a f u n ç ã o é o n ú mero de n e u r ô n i o s de uma camada .
19
− O r e t o r n o d e s s a f u n ç ã o s ã o o s v a l o r e s de b i a s i n i c i a l i z a d o s com 0 . 1 .
21 ’’’
def b i a s _ v a r i a b l e ( shape ) :
23 i n i t i a l = t f . c o n s t a n t ( 0 . 1 , shape=shape )
return t f . Variable ( i n i t i a l )
25
’ ’ ’ conv2d ( x , W)
27 − A e n t r a d a d e s s a f u n ç ã o é o volume de e n t r a d a ( x ) e o s p e s o s (W) da
camada , ambos no f o r m a t o [ b a t c h , a l t u r a , l a r g u r a , p r o f u n d i d a d e ] . Os
p e s o s da camada s ã o r e t o r n a d o s na f u n ç ã o w e i g h t _ v a r i a b l e .
29 − O r e t o r n o d e s s a f u n ç ã o é o volume de s a í da da camada ap ó s a o p e r a ç ã o
de c o n v o l u ç ã o .
31 − A v a r i á v e l s t r i d e s = [ 1 , 1 , 1 , 1 ] r e p r e s e n t a que o p a s s o ( s t r i d e ) da
c o n v o l u ç ã o é i g u a l a 1 em c a d a uma d a s d i m e n s õ e s .
33 − A v a r i á v e l p a d d i n g = ’SAME ’ r e p r e s e n t a que a o p e r a ç ã o de z e r o p a d d i n g
s e r á u t i l i z a d a p a r a que o volume de s a í da t e n h a a mesma d i m e n s ã o do
volume de e n t r a d a
’’’
35 d e f conv2d ( x , W) :
r e t u r n t f . nn . conv2d ( x , W, s t r i d e s = [ 1 , 1 , 1 , 1 ] , p a d d i n g = ’SAME ’ )
37
39 ’ ’ ’ max_pool_2x2 ( x )
− A e n t r a d a d e s s a f u n ç ã o é o volume de e n t r a d a ( x ) da camada de p o o l i n g
no f o r m a t o [ b a t c h , a l t u r a , l a r g u r a , p r o f u n d i d a d e ] .
41
− O r e t o r n o d e s s a f u n ç ã o é o volume de s a í da da camada ap ó s a o p e r a ç ã o
de max−p o o l i n g .
43
− A v a r i á v e l k s i z e = [ 1 , 2 , 2 , 1 ] r e p r e s e n t a que o f i l t r o u t i l i z a d o na
o p e r a ç ã o de p o o l i n g tem tamanho 2 x2 na a l t u r a e l a r g u r a , e tamanho
1 na d i m e n s ã o de b a t c h e p r o f u n d i d a d e .
45
− A v a r i á v e l s t r i d e s = [ 1 , 2 , 2 , 1 ] r e p r e s e n t a que o p a s s o ( s t r i d e ) da
o p e r a ç ã o de p o o l i n g é i g u a l a 2 na a l t u r a e l a r g u r a , e 1 na d i m e n s ã
o de b a t c h e p r o f u n d i d a d e .
47
− A v a r i á v e l p a d d i n g = ’SAME ’ r e p r e s e n t a que a o p e r a ç ã o de z e r o p a d d i n g
s e r á u t i l i z a d a p a r a que o volume de s a í da t e n h a dimens ão i g u a l a [
batch , a l t u r a / 2 , l a r g u r a / 2 , profundidade ] do volume de e n t r a d a .
49 ’’’
d e f max_pool_2x2 ( x ) :
51 r e t u r n t f . nn . max_pool ( x , k s i z e = [ 1 , 2 , 2 , 1] , s t r i d e s =[1 , 2 , 2 , 1] ,
p a d d i n g = ’SAME ’ )
5 #A v a r i á v e l y_ r e p r e s e n t a a s c l a s s e s d a s i m a g e n s de e n t r a d a . Na l i s t a
com p a r â m e t r o s [ None , 2 ] , o None é u t i l i z a d o p o r q u e n ã o sabemos a
q u a n t i d a d e de i m a g e n s de e n t r a d a . O 2 r e p r e s e n t a a q u a n t i d a d e de
c l a s s e s que a s i m a g e n s e s t ã o d i v i d i d a s .
y_ = t f . p l a c e h o l d e r ( t f . f l o a t 3 2 , [ None , 2 ] )
7
#A f u n ç ã o t f . r e s h a p e r e d i m e n s i o n a a v a r i á v e l x p a r a o f o r m a t o de
e n t r a d a que o T e n s o r f l o w a c e i t a .
9 x_image = t f . r e s h a p e ( x , [ − 1 , 1 0 0 , 1 0 0 , 3 ] )
11 #A v a r i á v e l W_conv1 i r á a r m a z e n a r o s p e s o s da p r i m e i r a camada
c o n v o l u c i o n a l , que t e r á 32 f i l t r o s de tamanho 5 x5 e p r o f u n d i d a d e 3 .
O volume de e n t r a d a d e s s a camada tem d i m e n s ã o [ b a t c h , 1 0 0 , 1 0 0 , 3 ] . O
volume de s a í da t e r á d i m e n s ã o i g u a l a [ b a t c h , 1 0 0 , 1 0 0 , 3 2 ]
W_conv1 = w e i g h t _ v a r i a b l e ( [ 5 , 5 , 3 , 3 2 ] )
13
#A v a r i á v e l b_conv1 i r á a r m a z e n a r o s v a l o r e s de b i a s p a r a o s 32 f i l t r o s
da p r i m e i r a camada c o n v o l u c i o n a l .
15 b_conv1 = b i a s _ v a r i a b l e ( [ 3 2 ] )
17 #A f u n ç ã o t f . nn . r e l u a p l i c a a f u n ç ã o de a t i v a ç ã o R e l u no volume de s a í
da da p r i m e i r a camada c o n v o l u c i o n a l . A v a r i á v e l h_conv1 i r á
a r m a z e n a r o s v a l o r e s r e s u l t a n t e da p r i m e i r a camada c o n v o l u c i o n a l .
h_conv1 = t f . nn . r e l u ( conv2d ( x_image , W_conv1 ) + b_conv1 )
19
#A v a r i á v e l h _ p o o l 1 i r á a r m a z e n a r o s v a l o r e s r e s u l t a n t e s ap ó s a o p e r a ç ã
o de max−p o o l . O volume de e n t r a d a d e s s a camada tem d i m e n s ã o [ b a t c h
, 1 0 0 , 1 0 0 , 3 2 ] . O volume de s a í da t e r á d i m e n s ã o i g u a l a [ b a t c h
,50 ,50 ,32]
21 h _ p o o l 1 = max_pool_2x2 ( h_conv1 )
23 #A v a r i á v e l W_conv2 i r á a r m a z e n a r o s p e s o s da s e g u n d a camada
c o n v o l u c i o n a l , que t e r á 64 f i l t r o s de tamanho 5 x5 e p r o f u n d i d a d e
3 2 . O volume de e n t r a d a d e s s a camada tem d i m e n s ã o [ b a t c h , 5 0 , 5 0 , 3 2 ] .
O volume de s a í da t e r á d i m e n s ã o i g u a l a [ b a t c h , 5 0 , 5 0 , 6 4 ]
W_conv2 = w e i g h t _ v a r i a b l e ( [ 5 , 5 , 3 2 , 6 4 ] )
25
#A v a r i á v e l b_conv2 i r á a r m a z e n a r o s v a l o r e s de b i a s p a r a o s 64 f i l t r o s
da s e g u n d a camada c o n v o l u c i o n a l .
27 b_conv2 = b i a s _ v a r i a b l e ( [ 6 4 ] )
29 #A f u n ç ã o t f . nn . r e l u a p l i c a a f u n ç ã o de a t i v a ç ã o R e l u no volume de s a í
da da s e g u n d a camada c o n v o l u c i o n a l . A v a r i á v e l h_conv2 i r á
a r m a z e n a r o s v a l o r e s r e s u l t a n t e da s e g u n d a camada c o n v o l u c i o n a l .
h_conv2 = t f . nn . r e l u ( conv2d ( h _ p o o l 1 , W_conv2 ) + b_conv2 )
31
#A v a r i á v e l h _ p o o l 2 i r á a r m a z e n a r o s v a l o r e s r e s u l t a n t e s ap ó s a o p e r a ç ã
o de max−p o o l . O volume de e n t r a d a d e s s a camada tem d i m e n s ã o [ b a t c h
, 5 0 , 5 0 , 6 4 ] . O volume de s a í da t e r á d i m e n s ã o i g u a l a [ b a t c h
,25 ,25 ,64]
33 h _ p o o l 2 = max_pool_2x2 ( h_conv2 )
35 #A v a r i á v e l W_fc1 i r á a r m a z e n a r o s p e s o s da p r i m e i r a camada t o t a l m e n t e
c o n e c t a d a . O volume de e n t r a d a d e s s a camada tem d i m e n s ã o [ b a t c h
, 2 5 , 2 5 , 6 4 ] . Na l i s t a com p a r â m e t r o s [ 4 0 0 0 0 , 1 0 2 4 ] , o v a l o r 4 0 . 0 0 0 é
u t i l i z a d o p o i s s ã o 2 5 * 2 5 * 6 4 = 4 0 . 0 0 0 c o n e x õ e s . 1024 r e p r e s e n t a a
q u a n t i d a d e de n e u r ô n i o s n e s s a camada .
W_fc1 = w e i g h t _ v a r i a b l e ( [ 4 0 0 0 0 , 1 0 2 4 ] )
37
#A v a r i á v e l b _ f c 1 i r á a r m a z e n a r o s v a l o r e s de b i a s p a r a o s 1024 f i l t r o s
da p r i m e i r a camada t o t a l m e n t e c o n e c t a d a .
39 b_fc1 = b i a s _ v a r i a b l e ( [ 1 0 2 4 ] )
41 #A f u n ç ã o t f . r e s h a p e a l t e r a o f o r m a t o do volume de s a í da da s e g u n d a
camada de p o o l i n g p a r a o f o r m a t o de e n t r a d a da p r i m e i r a camada
totalmente conectada .
h _ p o o l 2 _ f l a t = t f . r e s h a p e ( h _ p o o l 2 , [ −1 , 4 0 0 0 0 ] )
43
#A f u n ç ã o t f . nn . r e l u a p l i c a a f u n ç ã o de a t i v a ç ã o R e l u ap ó s a m u l t i p l i c a
ção ponto a ponto e n t r e o volume de e n t r a d a e o s p e s o s da p r i m e i r a
camada t o t a l m e n t e conectada .
45 h _ f c 1 = t f . nn . r e l u ( t f . matmul ( h _ p o o l 2 _ f l a t , W_fc1 ) + b _ f c 1 )
47 #A v a r i á v e l k e e p _ p r o b c o n t e r á a p o r c e n t a g e m de n e u r ô n i o s que s e r ã o
a t i v a d o s na a p l i c a ç ã o do \ t e x t i t { d r o p o u t } d u r a n t e o t r e i n a m e n t o .
keep_prob = t f . p l a c e h o l d e r ( t f . f l o a t 3 2 )
49
#A f u n ç ã o t f . nn . d r o p o u t a p l i c a o \ t e x t i t { d r o p o u t } no volume r e s u l t a n t e
ap ó s a p r i m e i r a camada t o t a l m e n t e c o n e c t a d a .
51 h _ f c 1 _ d r o p = t f . nn . d r o p o u t ( h _ f c 1 , k e e p _ p r o b )
53 #A v a r i á v e l W_fc2 c o n t e r á o s p e s o s da s e g u n d a camada t o t a l m e n t e
c o n e c t a d a . O volume de e n t r a d a d e s s a camada tem 1024 v a l o r e s ,
r e f e r e n t e s a q u a n t i d a d e de n e u r ô n i o s da camada a n t e r i o r . O s e g u n d o
p a r â m e t r o com v a l o r 2 r e p r e s e n t a a s d u a s c l a s s e s que a r e d e s e r á
treinada .
W_fc2 = w e i g h t _ v a r i a b l e ( [ 1 0 2 4 , 2 ] )
55
#A v a r i á v e l b _ f c 2 c o n t e r á o s v a l o r e s de b i a s p a r a o s d o i s n e u r ô n i o s da
s e g u n d a camada t o t a l m e n t e c o n e c t a d a .
57 b_fc2 = b i a s _ v a r i a b l e ( [ 2 ] )
59 #A f u n ç ã o t f . matmul r e a l i z a a m u l t i p l i c a ç ã o p o n t o a p o n t o e n t r e o
volume de e n t r a d a e o s p e s o s da s e g u n d a camada t o t a l m e n t e c o n e c t a d a
. y_conv é a v a r i á v e l que c o n t ém a e s t r u t u r a da r e d e .
y_conv = t f . matmul ( h _ f c 1 _ d r o p , W_fc2 ) + b _ f c 2
Código Fonte 7.2: Construindo a CNN utilizando as funções declaradas no Código Fonte
7.1.
7.5.3. Treinando a CNN
O Código Fonte 7.3 mostra como são criadas as variáveis necessárias para o treinamento
da CNN criada no Código Fonte 7.2.
1
#A f u n ç ã o s o f t m a x _ c r o s s _ e n t r o p y _ w i t h _ l o g i t s u t i l i z a a f u n ç ã o c r o s s −
e n t r o p y p a r a c a l c u l a r o e r r o e n t r e a s a í da g e r a d a p e l a CNN de uma
determinada e n t r a d a e a sua c l a s s e c o r r e s p o n d e n t e .
3 c r o s s _ e n t r o p y = t f . r e d u c e _ m e a n ( t f . nn . s o f t m a x _ c r o s s _ e n t r o p y _ w i t h _ l o g i t s (
y_conv , y_ ) )
5 #A f u n ç ã o t f . t r a i n . AdamOptimizer a t u a l i z a o s f i l t r o s e p e s o s da CNN
utilizando o backpropagation . A vari á vel train_step ser á u t i l i z a d a
p a r a r e a l i z a r o t r e i n a m e n t o da r e d e .
t r a i n _ s t e p = t f . t r a i n . AdamOptimizer ( 1 e −5) . m i n i m i z e ( c r o s s _ e n t r o p y )
7
#As d u a s p r ó x i m a s l i n h a s s ã o u t i l i z a d a s p a r a c o m p u t a r a p r e d i ç ã o da CNN
e c a l c u l a r a acur á cia obtida .
9 c o r r e c t _ p r e d i c t i o n = t f . e q u a l ( t f . argmax ( y_conv , 1 ) , t f . argmax ( y_ , 1 ) )
a c c u r a c y = t f . reduce_mean ( t f . c a s t ( c o r r e c t _ p r e d i c t i o n , t f . f l o a t 3 2 ) )
Código Fonte 7.3: Criando as variáveis necessárias para o treinamento da CNN construída
no Código Fonte 7.2.
O Código Fonte 7.4 mostra como é realizado a leitura das imagens e como é
realizado o treinamento da CNN.
1
#A f u n ç ã o r e a d _ i m a g e s r e c e b e o e n d e r e ç o da p a s t a que c o n t ém a b a s e de
d a d o s e r e t o r n a d o i s v e t o r e s , um c o n t e n d o a s i m a g e n s e o o u t r o
c o n t e n d o a c l a s s e de c a d a imagem .
3 def read_images ( path ) :
c l a s s e s = glob . glob ( path+ ’* ’ )
5 im_files = []
size_classes = []
7 for i in classes :
name_images_per_class = glob . glob ( i + ’ /* ’ )
9 im_f iles = im_f iles +name_images_per_class
s i z e _ c l a s s e s . append ( l e n ( name_images_per_class ) )
11 l a b e l s = np . z e r o s ( ( l e n ( i m _ f i l e s ) , l e n ( c l a s s e s ) ) )
13 ant = 0
for id_i , i in enumerate ( s i z e _ c l a s s e s ) :
15 l a b e l s [ ant : ant+i , i d _ i ] = 1
ant = i
17 collection = imread_collection ( im_files )
19 data = []
for id_i , i in enumerate ( c o l l e c t i o n ) :
21 d a t a . a p p e n d ( ( i . r e s h a p e ( 3 , −1 ) ) )
r e t u r n np . a s a r r a y ( d a t a ) , np . a s a r r a y ( l a b e l s )
23
25 #A v a r i á v e l p a t h c o n t ém o e n d e r e ç o da b a s e de i m a g e n s
path = ’ / Users / f l a v i o / database / ’
27
#A v a r i á v e l d a t a i r á r e c e b e r a s i m a g e n s p r e s e n t e na p a s t a e s p e c i f i c a d a .
J á a v a r i á v e l l a b e l s i r á r e c e b e r a c l a s s e de c a d a uma d a s i m a g e n s .
29 data , l a b e l s = read_images ( path )
31 #A v a r i á v e l b a t c h _ s i z e r e p r e s e n t a o n ú mero de i m a g e n s que s e r ã o
p r o c e s s a d a s a c a d a p a s s o de t r e i n a m e n t o .
b a t c h _ s i z e = 50
33
#A v a r i á v e l e p o c h s r e p r e s e n t a o n ú mero de é p o c a s de t r e i n a m e n t o da r e d e
. Uma é p o c a a c o n t e c e quando t o d a s a s i m a g e n s do c o n j u n t o de
t r e i n a m e n t o passam p e l a r e d e e a t u a l i z a m s e u s v a l o r e s de p e s o s e
filtros .
35 e p o c h s = 100
37 #A v a r i á v e l p e r c e n t c o n t ém a p o r c e n t a g e m de i m a g e n s que s e r ã o
u t i l i z a d a s para o treinamento .
percent = 0.9
39
#Os c ó d i g o s d a s p r ó x i m a s 5 l i n h a s e s t ã o a p e n a s e m b a r a l h a n d o a ordem d a s
imagens e dos l a b e l s .
41 data_size = len ( data )
i d x = np . a r a n g e ( d a t a _ s i z e )
43 random . s h u f f l e ( i d x )
data = data [ idx ]
45 l a b e l s = l a b e l s [ idx ]
47 # Formando o c o n j u n t o de t r e i n a m e n t o com a p o r c e n t a g e m de i m a g e n s
e s p e c i f i c a d o na v a r i á v e l p e r c e n t .
t r a i n = ( d a t a [ 0 : np . i n t ( d a t a _ s i z e * p e r c e n t ) , : , : ] , l a b e l s [ 0 : np . i n t (
data_size * percent ) ,:])
49
# Formando o c o n j u n t o de t e s t e com a s i m a g e n s que n ã o f o r a m u t i l i z a d a s
no t r e i n a m e n t o .
51 t e s t = ( d a t a [ np . i n t ( d a t a _ s i z e * (1− p e r c e n t ) ) : , : , : ] , l a b e l s [ np . i n t (
d a t a _ s i z e * (1− p e r c e n t ) ) : , : ] )
53 #A v a r i á v e l t r a i n _ s i z e c o n t ém o tamanho do c o n j u n t o de t r e i n a m e n t o .
t r a i n _ s i z e = len ( t r a i n [0])
55
# At é a q u i a p e n a s c r i a m o s a s v a r i á v e i s que i r ã o r e a l i z a r a s o p e r a ç õ e s do
T e n s o r f l o w , p o r ém é n e c e s s á r i o c r i a r uma s e s s ã o p a r a que e l a s
posam s e r e x e c u t a d a s .
57 sess = tf . InteractiveSession ()
59 #É n e c e s s á r i o i n i c i a l i z a r t o d a s a s v a r i á v e i s
t f . i n i t i a l i z e _ a l l _ v a r i a b l e s ( ) . run ( )
61
#La ç o p a r a r e p e t i r o p r o c e s s o de t r e i n a m e n t o p e l o n ú mero de é p o c a s
especificado .
63 f o r n in range ( epochs ) :
#La ç o p a r a d i v i d i r o c o n j u n t o de t r e i n a m e n t o em s u b c o n j u n t o s com o
tamanho e s p e c i f i c a d o na v a r i á v e l b a t c h _ s i z e . Cada i t e r a ç ã o d e s s e l a
ç o r e p r e s e n t a um b a t c h .
65 f o r i i n r a n g e ( i n t ( np . c e i l ( t r a i n _ s i z e / b a t c h _ s i z e ) ) ) :
#As p r ó x i m a s s e i s l i n h a s de c ó d i g o d i v i d e m o c o n j u n t o de
t r e i n a m e n t o nos b a t c h s .
67 i f ( i * b a t c h _ s i z e + b a t c h _ s i z e <= t r a i n _ s i z e ) :
batch = ( t r a i n [ 0][ i * batch_size : i * batch_size+batch_size ] ,
69 train [1][ i * batch_size : i * batch_size+batch_size ])
else :
71 batch = ( t r a i n [ 0][ i * batch_size : ] ,
train [1][ i * batch_size : ] )
73
# Chamando a f u n ç ã o de t r e i n a m e n t o da r e d e com o v a l o r de
dropout igual a 0 . 5 .
75 t r a i n _ s t e p . r u n ( f e e d _ d i c t ={ x : b a t c h [ 0 ] , y_ : b a t c h [ 1 ] , k e e p _ p r o b :
0.5})
77 # E x i b i n d o a a c u r á c i a o b t i d a u t i l i z a n d o o c o n j u n t o de
t r e i n a m e n t o a cada 5 i t e r a çõ es .
i f ( n%5 == 0 ) :
79 p r i n t ( " Epoca %d , a c u r a c i a do t r e i n a m e n t o = %g " %(n ,
train_accuracy ) )
Vale destacar que o treinamento da rede foi realizado por 100 épocas e a Figura
7.14 apresenta os valores de acurácia no decorrer das épocas de treinamento.
Figura 7.14: Valores de acurácia obtidos a cada 5 épocas utilizando o conjunto de treina-
mento.
7.5.4. Classificação com a CNN
O Código Fonte 7.5 mostra como utilizar a CNN para classificar o conjunto de teste e
computar a acurácia. Vale destacar que a acurácia obtida foi de aproximadamente 92%.
2 # P a r a c o m p u t a r a a c u r á c i a o b t i d a p e l a CNN b a s t a chamar a v a r i á v e l
a c c u r a c y c r i a d a a n t e r i o r m e n t e , e e s p e c i f i c a r m o s a s i m a g e n s de
e n t r a d a e a s c l a s s e s c o r r e s p o n d e n t e s . A v a r i á v e l k e e p _ p r o b que
r e p r e s e n t a o dropout recebe o valor 1 , pois essa opera ção é
u t i l i z a d a s o m e n t e no t r e i n a m e n t o .
a c u r a c i a = a c c u r a c y . e v a l ( f e e d _ d i c t ={ x : t e s t [ 0 ] [ : ] , y_ : t e s t [ 1 ] [ : ] ,
keep_prob : 1 . 0 } )
4 p r i n t ( " Acuracia = " , acuracia )
Código Fonte 7.5: Usando a CNN para classificar o conjunto de teste e computar a
acurácia obtida.
Referências
[Abadi et al. 2015] Abadi, M. et al. (2015). TensorFlow: Large-scale machine learning
on heterogeneous systems. http://tensorflow.org/. Software disponível em
tensorflow.org.
[Aggarwal et al. 2001] Aggarwal, C. C., Hinneburg, A., e Keim, D. A. (2001). On the
surprising behavior of distance metrics in high dimensional space. Em Lecture Notes
in Computer Science, páginas 420–434. Springer.
[Al-Rfou et al. 2016] Al-Rfou, R. et al. (2016). Theano: A Python framework for fast
computation of mathematical expressions. arXiv e-prints, abs/1605.02688.
[Bell et al. 2014] Bell, S., Upchurch, P., Snavely, N., e Bala, K. (2014). Material recog-
nition in the wild with the materials in context database. Em 2014 Computer Vision
and Pattern Recognition (CVPR).
[Bishop 2006] Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Sprin-
ger.
[Collobert et al. 2011] Collobert, R., Kavukcuoglu, K., e Farabet, C. (2011). Torch7: A
matlab-like environment for machine learning. Em BigLearn, NIPS Workshop.
[Deng et al. 2009] Deng, J., Dong, W., Socher, R., Li, L.-J., Li, K., e Fei-Fei, L. (2009).
ImageNet: A Large-Scale Hierarchical Image Database. Em CVPR09.
[dos Santos Ferreira 2017] dos Santos Ferreira, A. (2017). Redes neurais convolucio-
nais profundas na detecção de plantas daninhas em lavoura de soja. Dissertação de
mestrado, Universidade Federal de Mato Grosso do Sul.
[Fu et al. 2016] Fu, R., Li, B., Gao, Y., e Wang, P. (2016). Content-based image retrieval
based on cnn and svm. Em 2016 2nd IEEE International Conference on Computer and
Communications (ICCC), páginas 638–642.
[Goodfellow et al. 2016] Goodfellow, I., Bengio, Y., e Courville, A. (2016). Deep le-
arning (adaptive computation and machine learning series). Cambridge: The MIT
Press.
[Haykin et al. 2009] Haykin, S. S., Haykin, S. S., Haykin, S. S., e Haykin, S. S. (2009).
Neural networks and learning machines, volume 3. Pearson Upper Saddle River, NJ,
USA:.
[He et al. 2016] He, K., Zhang, X., Ren, S., e Sun, J. (2016). Deep residual learning for
image recognition. Em Proceedings of the IEEE Conference on Computer Vision and
Pattern Recognition, páginas 770–778.
[Jia et al. 2014] Jia, Y., Shelhamer, E., Donahue, J., Karayev, S., Long, J., Girshick, R.,
Guadarrama, S., e Darrell, T. (2014). Caffe: Convolutional architecture for fast feature
embedding. arXiv preprint arXiv:1408.5093.
[Karpathy 2017] Karpathy, A. (2017). Convolutional neural networks for visual recogni-
tion. http://cs231n.github.io/convolutional-networks/.
[Krizhevsky et al. 2012] Krizhevsky, A., Sutskever, I., e Hinton, G. E. (2012). Imagenet
classification with deep convolutional neural networks. Em Pereira, F., Burges, C. J. C.,
Bottou, L., e Weinberger, K. Q., editors, Advances in Neural Information Processing
Systems 25, páginas 1097–1105. Curran Associates, Inc.
[Lecun et al. 1998] Lecun, Y., Bottou, L., Bengio, Y., e Haffner, P. (1998). Gradient-
based learning applied to document recognition. Em Proceedings of the IEEE, páginas
2278–2324.
[Liu et al. 2016] Liu, X., Tizhoosh, H. R., e Kofman, J. (2016). Generating binary tags
for fast medical image retrieval based on convolutional nets and radon transform. Em
2016 International Joint Conference on Neural Networks (IJCNN), páginas 2872–
2878.
[Ren et al. 2015] Ren, S., He, K., Girshick, R., e Sun, J. (2015). Faster r-cnn: Towards
real-time object detection with region proposal networks. Em Advances in Neural
Information Processing Systems 28, páginas 91–99.
[Simonyan e Zisserman 2014] Simonyan, K. e Zisserman, A. (2014). Very deep convo-
lutional networks for large-scale image regognition. Em CVPR14.
[Szegedy et al. 2016] Szegedy, C., Ioffe, S., e Vanhoucke, V. (2016). Inception-
v4, inception-resnet and the impact of residual connections on learning. CoRR,
abs/1602.07261.
[Szegedy et al. 2015] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D.,
Erhan, D., Vanhoucke, V., e Rabinovich, A. (2015). Going deeper with convolutions.
Em The IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[Ujjwal 2016] Ujjwal, K. (2016). An intuitive explanation of convoluti-
onal neural networks. https://ujjwalkarn.me/2016/08/11/
intuitive-explanation-convnets/.
[van Ginneken et al. 2015] van Ginneken, B., Setio, A. A. A., Jacobs, C., e Ciompi, F.
(2015). Off-the-shelf convolutional neural network features for pulmonary nodule de-
tection in computed tomography scans. Em 2015 IEEE 12th International Symposium
on Biomedical Imaging (ISBI), páginas 286–289.
[Vedaldi e Lenc 2015] Vedaldi, A. e Lenc, K. (2015). Matconvnet – convolutional neural
networks for matlab. Em Proceeding of the ACM Int. Conf. on Multimedia.
[Wang e Wang 2016] Wang, L. e Wang, X. (2016). Model and metric choice of image re-
trieval system based on deep learning. Em 2016 9th International Congress on Image
and Signal Processing, BioMedical Engineering and Informatics (CISP-BMEI), pági-
nas 390–395.
[Zeiler e Fergus 2013] Zeiler, M. D. e Fergus, R. (2013). Visualizing and understanding
convolutional networks. Em CVPR13.
[Zhang et al. 2015] Zhang, Y., Ozay, M., Liu, X., e Okatani, T. (2015). Integrating deep
features for material recognition.
[Zhu et al. 2015] Zhu, R., Zhang, R., e Xue, D. (2015). Lesion detection of endoscopy
images based on convolutional neural network features. Em 2015 8th International
Congress on Image and Signal Processing (CISP), páginas 372–376.