< Return to Video

RDAG CAP02 2025 VA06 PYTHON APLICACAO CNN

  • 0:08 - 0:10
    Como podemos
    utilizar uma CNN
  • 0:10 - 0:13
    para classificar imagens
    com o deep learning?
  • 0:13 - 0:14
    Nesse momento do curso,
  • 0:14 - 0:16
    você já conhece o que são
    redes neurais artificiais,
  • 0:16 - 0:19
    o que é um deep learning
    também e, sobretudo,
  • 0:19 - 0:20
    que existem diversas
    arquiteturas
  • 0:20 - 0:22
    para trabalhar com redes
    neurais profundas.
  • 0:22 - 0:25
    Aqui, vamos dar
    um destaque na CNNs,
  • 0:25 - 0:27
    que são as bases para diversas
    outras arquiteturas também,
  • 0:27 - 0:31
    inclusive para treinar outros
    tipos de tarefas mais complexas,
  • 0:31 - 0:34
    como segmentação
    e detecção de objetos.
  • 0:34 - 0:37
    Então, vamos começar o básico,
    que é classificar imagens.
  • 0:37 - 0:41
    Será que, nessa imagem, nós
    temos um objeto ou outro objeto?
  • 0:41 - 0:44
    Sem nos preocuparmos,
    a princípio, onde eles estão,
  • 0:44 - 0:47
    em qual posição da imagem
    eles estão, também,
  • 0:47 - 0:51
    o fato é saber a qual classe
    essa imagem pertence.
  • 0:51 - 0:52
    Vamos para o código?
  • 0:52 - 0:56
    Bom, aqui no ambiente, eu estou
    com o código já programado,
  • 0:56 - 0:58
    mas o meu ambiente
    está desligado.
  • 0:58 - 1:01
    E, hoje, eu vou fazer
    uma coisa diferente,
  • 1:01 - 1:03
    normalmente acabo
    utilizando o código pronto
  • 1:03 - 1:05
    e vou executando
    eles com vocês,
  • 1:05 - 1:08
    indicando, passo a passo,
    o que está acontecendo.
  • 1:08 - 1:11
    Como esse código é um pouco
    lento para ser reproduzido,
  • 1:11 - 1:13
    eu já vou trazer
    o código executado
  • 1:13 - 1:18
    e vou fixar pontos de destaque
    do código e da saída.
  • 1:18 - 1:21
    Convido vocês a pegarem
    um código pronto,
  • 1:21 - 1:23
    reproduzirem no seu
    ambiente, também,
  • 1:23 - 1:26
    testarem com outros parâmetros
    e verificarem o impacto disso
  • 1:26 - 1:29
    em tempo de execução
    e, também, nos resultados.
  • 1:29 - 1:33
    A primeira tarefa a ser executada
    aqui é esse "pip install"
  • 1:33 - 1:37
    para nós estabelecemos as versões
    do TensorFlow e do Keras.
  • 1:37 - 1:39
    É importante dar
    esse destaque
  • 1:39 - 1:42
    para saber exatamente qual versão
    das bibliotecas eu vou utilizar,
  • 1:42 - 1:45
    porque, dependendo do tipo
    de versão que estamos utilizando,
  • 1:45 - 1:50
    pode haver alguma incompatibilidade
    entre o código da versão antiga
  • 1:50 - 1:53
    e da versão nova, o que vai
    quebrar nossa execução.
  • 1:53 - 1:54
    Quando a gente
    estabelece exatamente
  • 1:54 - 1:56
    qual versão de biblioteca
    nós vamos utilizar,
  • 1:56 - 1:59
    nós evitamos esse
    tipo de problema.
  • 1:59 - 2:02
    É claro que, no desenvolvimento
    padrão de bibliotecas,
  • 2:02 - 2:05
    a evolução é natural
    e é constante,
  • 2:05 - 2:07
    mas os desenvolvedores
    dessas bibliotecas
  • 2:07 - 2:10
    tendem a fazer uma versão
    compatível com as anteriores.
  • 2:10 - 2:15
    No entanto, alterações podem
    ocorrer quebrando códigos antigos,
  • 2:15 - 2:18
    então, nesse caso, é sempre
    importante ficar de olho
  • 2:18 - 2:20
    nas versões das bibliotecas
    que estamoso utilizando
  • 2:20 - 2:23
    para evitar problemas futuros
    no nosso código também.
  • 2:23 - 2:25
    Esse comando vai instalar,
    aqui no nosso ambiente,
  • 2:25 - 2:28
    o TensorFlow e o Keras
    nas versões aqui indicadas.
  • 2:28 - 2:32
    Se a gente não fala nada
    e nem executa essa célula aqui,
  • 2:32 - 2:36
    já vai ter uma versão do TensorFlow
    e do Keras instalada previamente.
  • 2:36 - 2:39
    O que nós queremos
    fazer aqui é o seguinte:
  • 2:39 - 2:41
    desinstalar a versão anterior
  • 2:41 - 2:44
    e instalar estas versões
    no nosso ambiente.
  • 2:44 - 2:47
    Note pela saída
    dessa célula
  • 2:47 - 2:51
    que é um tempinho para poder
    instalar o que necessário.
  • 2:51 - 2:55
    Esse erro aqui é natural, faz parte
    do processo de tentativa e erro.
  • 2:55 - 2:57
    Inclusive, esse erro vai aparecer
    porque ele está falando o seguinte:
  • 2:57 - 3:00
    "olha só, você pegou
    um ambiente já pronto,
  • 3:00 - 3:02
    você está desinstalando coisas
    e instalando novamente",
  • 3:02 - 3:04
    ou seja, reinicie o ambiente,
  • 3:04 - 3:07
    vai aparecer uma mensagem na tela
    pedindo "reinicie o ambiente".
  • 3:07 - 3:11
    É só dar "ok", reiniciar, dependendo
    de como estiver na sua tela,
  • 3:11 - 3:13
    e ele vai ligar novamente
    esse ambiente
  • 3:13 - 3:17
    e ligar novamente esse
    ambiente de execução
  • 3:17 - 3:21
    já com as bibliotecas instaladas
    nas versões que nós solicitamos.
  • 3:21 - 3:24
    Feito isso, nós podemos começar
    com o código de verdade.
  • 3:24 - 3:26
    E, aqui, temos os imports
    necessários
  • 3:26 - 3:28
    para esse tipo de trabalho.
  • 3:28 - 3:30
    Vamos importar
    o TensorFlow, Numpy,
  • 3:30 - 3:32
    Seaborn para fazer
    alguns gráficos também.
  • 3:32 - 3:37
    Da parte do sklearn, vamos
    importar a matriz de confusão
  • 3:37 - 3:38
    para exibir melhor
    os resultados.
  • 3:38 - 3:46
    Da parte de redes, vamos fazer
    alguns imports de código específicos
  • 3:46 - 3:48
    para trabalhar
    com o TensorFlow
  • 3:48 - 3:51
    para construir sistemas
    com deep learning,
  • 3:51 - 3:54
    então redes sequenciais,
    as camadas
  • 3:54 - 3:57
    das camadas, vamos importar várias
    camadas que existem também.
  • 3:57 - 3:58
    O mecanismo
    de Early Stopping,
  • 3:58 - 4:03
    Rescaling para mudar a dimensão
    das imagens também.
  • 4:03 - 4:06
    E note que, aqui, estou
    importando também
  • 4:06 - 4:08
    a rede pronta do VGG16.
  • 4:08 - 4:12
    Poderia importar outra
    rede pré-pronta também,
  • 4:12 - 4:16
    e estou importando aqui
    o pré-processamento
  • 4:16 - 4:20
    das entradas que vão
    alimentar essa rede VGG16.
  • 4:20 - 4:24
    Para treinar uma rede do zero,
    isso ainda não será necessário,
  • 4:24 - 4:27
    mas guarde essa informação,
    porque vamos voltar logo, logo,
  • 4:27 - 4:29
    quando falarmos
    de transfer learning.
  • 4:29 - 4:34
    Pois bem, então temos, aqui,
    as camadas, os modelos específicos,
  • 4:34 - 4:36
    e, agora, a gente começa
    com o código de verdade.
  • 4:36 - 4:39
    A primeira parte do nosso
    código, essa célula aqui,
  • 4:39 - 4:42
    é para carregar o dataset
    para memória, ou seja,
  • 4:42 - 4:45
    eu não vou subir um arquivo
    de dados aqui,
  • 4:45 - 4:49
    essa base de categorias de flores,
    são 5 categorias possíveis,
  • 4:49 - 4:54
    já está dentro do TensorFlow, estou
    importando isso aqui para memória.
  • 4:54 - 4:57
    Então, estou dando
    um load, carregar,
  • 4:57 - 5:00
    o TensorFlow "flowers",
    tipo de flores,
  • 5:00 - 5:02
    já na proporção
    de treino e teste,
  • 5:02 - 5:06
    e ele já vai carregar para gente
    uma divisão em duas tuplas:
  • 5:06 - 5:09
    a tupla de treinamento
    e a tupla de teste.
  • 5:09 - 5:12
    Tanto do ponto de vista
    do dado em si,
  • 5:12 - 5:15
    o dado de treinamento,
    o dado de teste,
  • 5:15 - 5:18
    e os labels de treinamento
    e de teste também.
  • 5:18 - 5:21
    Note que até esse processo,
    também, demora um pouquinho,
  • 5:21 - 5:24
    não muito, mas demora
    um pouquinho também
  • 5:24 - 5:27
    para ser carregado, porque
    é uma base grande, de fato.
  • 5:27 - 5:31
    Aqui, eu posso mostrar
    o tamanho desses arquivos,
  • 5:31 - 5:38
    então o meu arquivo de treino
    ele tem duas 2.569 imagens
  • 5:38 - 5:41
    e a de teste tem 1.101 imagens.
  • 5:41 - 5:44
    Não importa se estou
    no treino ou no teste,
  • 5:44 - 5:46
    nós temos as mesmas
    dimensões desses dados,
  • 5:46 - 5:50
    ou seja, cada imagem é
    expressa, originalmente,
  • 5:50 - 5:56
    em 442 por 1024 pixels
    expressos em três canais, RGB.
  • 5:56 - 6:00
    Mesma coisa para o treino,
    mesma coisa para o teste.
  • 6:00 - 6:04
    Agora, a gente começa
    pré-processando esses dados.
  • 6:04 - 6:05
    Estou dizendo o seguinte:
  • 6:05 - 6:08
    eu vou trabalhar com
    o tamanho de 150 por 150.
  • 6:08 - 6:11
    Ou seja, eu não vou trabalhar
    com a imagem no tamanho original
  • 6:11 - 6:15
    e vou reescalá-las para esse
    tamanho de 150 por 150.
  • 6:15 - 6:19
    Aí você pode estar pensando:
    "mas Michel, a imagem é retangular,
  • 6:19 - 6:23
    você está escalando em algo
    quadrado, não vai dar um problema?"
  • 6:23 - 6:26
    É, não vai ficar exatamente a mesma
    imagem com a mesma proporção,
  • 6:26 - 6:29
    mas isso vai preservar
    os elementos essenciais
  • 6:29 - 6:33
    que são necessários para
    reconhecer se é uma rosa,
  • 6:33 - 6:36
    ou uma orquídea, ou qualquer
    outro tipo de flor também.
  • 6:36 - 6:40
    Pois bem, dado esse tamanho
    desejado, 150 por 150,
  • 6:40 - 6:44
    eu vou fazer um resizing
    nos dados de treinamento,
  • 6:44 - 6:48
    passando o dado que eu quero,
    tanto de trainamento quanto o teste,
  • 6:48 - 6:52
    e gerando novos dados,
    digamos assim, já reescalados.
  • 6:52 - 6:55
    E, agora, eu estou transformando,
    além de transformar o dado em si,
  • 6:55 - 6:59
    vou transformar o label
    para um formato categórico.
  • 6:59 - 7:04
    Ou seja, em vez de falar
    que temos as classes 0, 1, 2, 3, 4,
  • 7:04 - 7:07
    cada, label vai ser um vetorzinho
    com 5 posições,
  • 7:07 - 7:09
    com valores entre 0 e 1.
  • 7:09 - 7:13
    Cada posição indica um tipo de flor,
    ou seja, deixei o label categórico.
  • 7:13 - 7:15
    E mostrando, aqui,
    as novas dimensões,
  • 7:15 - 7:18
    temos, por exemplo,
    aqui para o treinamento
  • 7:18 - 7:23
    continuam as mesmas
    2569 imagens,
  • 7:23 - 7:26
    agora rescaladas
    em 150 por 150 pixels,
  • 7:26 - 7:30
    e também continuam
    expressas em três canais, RGB.
  • 7:30 - 7:33
    E o label fica exatamente
    como tinha previsto.
  • 7:33 - 7:36
    Cada linha aqui é um label
    de uma imagem diferente,
  • 7:36 - 7:39
    então essa primeira coluna
    representa uma classe,
  • 7:39 - 7:42
    a segunda, terceira, quarta,
    quinta, e assim por diante.
  • 7:42 - 7:45
    Ou seja, estou ativando a terceira
    classe, entre aspas, aqui,
  • 7:45 - 7:47
    com I e 0 no resto.
  • 7:47 - 7:50
    Nesse ponto, eu posso começar
    a construir nossos modelos.
  • 7:50 - 7:53
    Então, eu vou fazer o primeiro
    modelo treinando do zero,
  • 7:53 - 7:55
    eu vou definir a arquitetura
    e vou treiná-la do zero
  • 7:55 - 7:57
    a partir dessas imagens.
  • 7:57 - 7:59
    Ou seja, eu vou começar
    com uma rede
  • 7:59 - 8:01
    com pesos totalmente aleatórios
  • 8:01 - 8:05
    e vou treinar, do zero,
    como posicionar esses pesos
  • 8:05 - 8:07
    para, de fato, aprender
    a classificar se, nessa imagem,
  • 8:07 - 8:11
    tem uma flor do tipo 1, tipo 2,
    tipo 3, tipo 4 ou tipo 5.
  • 8:11 - 8:13
    Vamos ver o processo
    para isso.
  • 8:13 - 8:15
    Então, essa célula aqui
    está um pouquinho grande,
  • 8:15 - 8:16
    tem bastante código,
  • 8:16 - 8:19
    vamos entender ponta a ponta
    o que estamos fazendo.
  • 8:19 - 8:23
    Nós sabemos que, para
    definir o modelo profundo,
  • 8:23 - 8:26
    nós temos que definir
    a arquitetura desse modelo.
  • 8:26 - 8:27
    Então, ele vai ser
    um modelo sequencial,
  • 8:27 - 8:30
    ou seja, sai de uma camada,
    vai para a próxima,
  • 8:30 - 8:32
    para a próxima,
    para a próxima.
  • 8:32 - 8:35
    E, nesse modelo sequencial,
    que eu chamo de "hand model"...
  • 8:35 - 8:38
    "Hand model" porque é
    o modelo que vou fazer a mão,
  • 8:38 - 8:39
    vou fazer do zero.
  • 8:39 - 8:42
    Outras abordagens são
    transfer learning, fine tuning,
  • 8:42 - 8:46
    mas, para o começo, vamos por
    uma rede simples, treinada do zero,
  • 8:46 - 8:49
    desenhada uma arquitetura a mão.
  • 8:49 - 8:51
    Então vamos lá, eu vou desenhar
    a mão essa arquitetura.
  • 8:51 - 8:56
    Ela é sequencial, ela começa
    e eu vou adicionando camadas.
  • 8:56 - 8:59
    A primeira camada é uma camada
    de reescalar o dado, ou seja,
  • 8:59 - 9:03
    entra uma imagem
    de 150 por 150 pixels,
  • 9:03 - 9:07
    só que eu vou dividir
    cada pixel por 255.
  • 9:07 - 9:09
    Por que a gente
    vai fazer isso?
  • 9:09 - 9:12
    Lembra, cada pixel é
    expresso de 0 até 255,
  • 9:12 - 9:14
    então quando eu divido
    esse número por 255,
  • 9:14 - 9:18
    eu estou levando
    os dados da matriz,
  • 9:18 - 9:21
    a matriz de pixels
    da imagem, entre 0 e 1.
  • 9:21 - 9:25
    E fica um valor mais estável para
    a rede conseguir aprender melhor
  • 9:25 - 9:29
    onde posicionar esses pesos
    que modelam esse problema.
  • 9:29 - 9:30
    Beleza.
  • 9:30 - 9:33
    Então, no fundo, essa camada aqui
    é uma camada de normalização.
  • 9:33 - 9:36
    Depois, eu já vou passar
    para uma camada convolucional,
  • 9:36 - 9:39
    com 16 filtros, com ativação
    de linear retificada
  • 9:39 - 9:42
    em kernel de tamanho 10,
    essa janela deslizante.
  • 9:42 - 9:45
    E vou engatar, aqui,
    uma camada de max pooling.
  • 9:45 - 9:48
    Depois, eu faço uma outra
    camada convolucional,
  • 9:48 - 9:51
    outra camada de max pooling,
    outra camada convolucional,
  • 9:51 - 9:53
    outra camada de max pooling,
  • 9:53 - 9:58
    e, pronto, terminei aqui
    a minha arquitetura CNN.
  • 9:58 - 10:01
    Ou seja, terminei, aqui,
    o encadeamento de camadas
  • 10:01 - 10:05
    que extrai características
    da minha imagem de entrada.
  • 10:05 - 10:07
    Não está a camada inteira ainda,
    falta a camada de decisão,
  • 10:07 - 10:11
    mas eu fiz uma camada
    de extração de features.
  • 10:11 - 10:13
    Será que essa é melhor
    arquitetura que eu poderia fazer?
  • 10:13 - 10:15
    Não sei, provavelmente não.
  • 10:15 - 10:17
    Mas é uma camada inicial
    para indicar o seguinte:
  • 10:17 - 10:19
    a arquitetura é
    a gente que define,
  • 10:19 - 10:26
    então eu decidi encadear três
    convoluções seguidas de pooling
  • 10:26 - 10:27
    em cada uma delas.
  • 10:27 - 10:28
    Poderia fazer diferente?
  • 10:28 - 10:32
    Poderia, cada arquitetura
    tem as suas possibilidades
  • 10:32 - 10:34
    de serem construídas
    com vantagens e desvantagens.
  • 10:34 - 10:37
    Aqui, eu quis criar
    uma arquitetura simples.
  • 10:37 - 10:40
    Dada essa parte de extração,
    vamos a parte de decisão,
  • 10:40 - 10:43
    ou seja, quando nós saímos
    dessa última camada,
  • 10:43 - 10:44
    nós temos uma feature pronta.
  • 10:44 - 10:47
    Vamos, então,
    alimentar essa feature,
  • 10:47 - 10:48
    extrair dos dados
    de entrada,
  • 10:48 - 10:52
    para fazer a classificação
    do modelo.
  • 10:52 - 10:56
    E eu vou começar com uma camada
    de achatamento, ou seja,
  • 10:56 - 10:58
    não importa o que vai sair
    dessa última camada,
  • 10:58 - 11:02
    eu quero que isso vire um vetor,
    uma linha e tantas colunas.
  • 11:02 - 11:05
    Depois, eu vou trazer
    duas camadas densas,
  • 11:05 - 11:09
    duas camadas densas fortemente
    conectadas, totalmente conectadas,
  • 11:09 - 11:12
    que são uma camadas ocultas
    de uma RNN tradicional.
  • 11:12 - 11:16
    E eu termino com uma outra camada
    densa totalmente conectada, no caso,
  • 11:16 - 11:20
    com 5 neurônios, porque
    nós temos 5 classes.
  • 11:20 - 11:23
    Então, vai ser alguma delas
    que vai ser ativada.
  • 11:23 - 11:26
    Notem que a minha função
    de ativação aqui é um softmax.
  • 11:26 - 11:30
    Ou seja, cada um dos neurônios
    da última camada, dos 5 neurônios,
  • 11:30 - 11:31
    vai ser ativados
    de alguma forma,
  • 11:31 - 11:35
    alguns muito pouco
    e outros bem mais.
  • 11:35 - 11:36
    Qual vai ser o label final?
  • 11:36 - 11:38
    Max, o que está
    mais ativado.
  • 11:38 - 11:40
    Mas eles são ativados
    de forma soft, ou seja,
  • 11:40 - 11:42
    cada um pode ser
    um pouquinho ativado
  • 11:42 - 11:45
    caso tenha alguma
    confusão entre as classes,
  • 11:45 - 11:48
    mas o label final é ativado
    pelo que foi mais ativado.
  • 11:48 - 11:52
    Em todas essas etapas aqui, eu
    defini a captura completa da rede,
  • 11:52 - 11:54
    desde de a etapa de CNN,
    extração de características,
  • 11:54 - 11:58
    até etapa de aprendizado, de fato,
    o que significa as características.
  • 11:58 - 12:02
    Agora, eu vou compilar o modelo
    indicando qual vai ser o otimizador,
  • 12:02 - 12:03
    qual vai ser a minha loss,
  • 12:03 - 12:05
    qual vai ser a métrica que eu
    vou otimizar também.
  • 12:05 - 12:09
    E, na sequência, eu vou definir
    uma estratégia de early stopping,
  • 12:09 - 12:15
    ou seja, eu vou monitorar a acurácia
    no conjunto de validação,
  • 12:15 - 12:19
    tendo uma paciência
    de 5 épocas.
  • 12:19 - 12:21
    E, quando o early
    stopping for ativado,
  • 12:21 - 12:25
    eu vou resgatar
    os melhores pesos.
  • 12:25 - 12:28
    O que isso quer
    dizer, gente?
  • 12:28 - 12:30
    Quer dizer o seguinte:
    em tempo de treinamento,
  • 12:30 - 12:33
    a gente está constantemente
    olhando o dado da validação,
  • 12:33 - 12:35
    os acertos e os erros.
  • 12:35 - 12:40
    Eu estou avaliando
    a acurácia da validação.
  • 12:40 - 12:43
    Ou seja, se essa acurácia
    no ______ de validação
  • 12:43 - 12:45
    não estiver melhorando
    de forma significativa
  • 12:45 - 12:49
    por 5 épocas consecutivas, eu vou
    parar o treinamento aí mesmo.
  • 12:49 - 12:50
    Não importa em que
    época eu esteja,
  • 12:50 - 12:54
    eu vou parar porque não
    há sinais de melhora.
  • 12:54 - 12:56
    E, depois que eu defino
    todas as estratégias,
  • 12:56 - 12:59
    aí sim, eu vou fazer
    o treinamento, fitting,
  • 12:59 - 13:02
    do meu modelo, modelo
    aqui treinadona mão,
  • 13:02 - 13:05
    definindo na mão, de fato,
    utilizando uma GPU.
  • 13:05 - 13:07
    Aqui, eu vou treinar utilizando
    o dado treinamento
  • 13:07 - 13:10
    e seus labels também.
  • 13:10 - 13:13
    Aqui, só porque é um modelo
    que demora para rodar,
  • 13:13 - 13:16
    eu coloquei que vou rodar
    por, no máximo, 5 épocas.
  • 13:16 - 13:19
    Eu poderia colocar 50,
    poderia colocar 500, tá?
  • 13:19 - 13:25
    Aqui, eu mantive pelo menos
    5, é o mínimo do mínimo.
  • 13:25 - 13:26
    Falei o seguinte:
  • 13:26 - 13:30
    do dado de treinamento,
    utilize 20% para a validação,
  • 13:30 - 13:34
    selecione 32 entre 2 imagens
    para fazer tamanho do meu batch.
  • 13:34 - 13:35
    E tem algum callback?
  • 13:35 - 13:39
    Tem algo que modifica
    esse treinamento?
  • 13:39 - 13:41
    Sim, uma estratégia
    de early stopping.
  • 13:41 - 13:43
    Note que aqui já
    está executado,
  • 13:43 - 13:46
    então ele foi executando
    a primeira época,
  • 13:46 - 13:48
    a segunda, a terceira,
    a quarta, a quinta.
  • 13:48 - 13:51
    Notem que a minha loss,
    a função de perda, os erros,
  • 13:51 - 13:55
    foram melhorando, a minha
    acurácia está aumentando,
  • 13:55 - 13:58
    a acurácia na validação
    está aumentando também.
  • 13:58 - 13:59
    É o que eu esperava.
  • 13:59 - 14:03
    Essa pequena saída já mostra
    que tem espaço para melhoria sim.
  • 14:03 - 14:05
    Se eu tivesse o deixado
    treinar por mais épocas,
  • 14:05 - 14:08
    com certeza esse
    modelo ficaria melhor.
  • 14:08 - 14:10
    Mas aí a gente parou
    com 5 épocas mesmo,
  • 14:10 - 14:12
    porque já era o suficiente
    para entender um pouco
  • 14:12 - 14:16
    dos resultados que essa
    rede definida do zero
  • 14:16 - 14:19
    poderia trazer como vantagem
    ou desvantagem
  • 14:19 - 14:21
    como classificador de imagem.
  • 14:21 - 14:24
    Dado esse momento que a rede
    está treinada, temos que avaliá la.
  • 14:25 - 14:29
    Então vou dar um ponto evaluation
    passando dados e os lembro de teste
  • 14:29 - 14:32
    indicando qual vai ser
    e qual vai ser a acurácia.
  • 14:32 - 14:37
    Note a minha acurácia
    no conjunto de teste foi 54%.
  • 14:38 - 14:40
    Não está muito bom.
  • 14:40 - 14:44
    Ok, ela aprendeu alguma coisa,
    está um pouco acima do aleatório,
  • 14:44 - 14:44
    mas aprendeu
  • 14:44 - 14:49
    pouco, Ou seja, tem chance, tem chão
    para poder conseguir aprender mais.
  • 14:50 - 14:53
    Só que como nós treinamos por pouco tempo,
    o máximo que conseguiu aprender
  • 14:53 - 14:58
    foi para conseguir
    fazer esse tipo de acerto. 54%.
  • 14:59 - 15:03
    No entanto, acurácia
    pode ser uma métrica global meio vaga.
  • 15:03 - 15:08
    Ok, ela acertou 54% no teste,
    mas será que acertou mais de uma classe?
  • 15:08 - 15:09
    Mas de outra?
  • 15:09 - 15:12
    Nós podemos tirar essa dúvida
    com a matriz de confusão.
  • 15:12 - 15:14
    Aqui embaixo
    temos a matriz de confusão cotada
  • 15:14 - 15:19
    e olhem só a distribuição
    dos dados de teste nessa matriz.
  • 15:20 - 15:23
    Lembrem que a matriz,
    que a diagonal principal são os acertos.
  • 15:24 - 15:27
    Então temos 220 acertos aqui
  • 15:27 - 15:32
    e 33 aqui, 130 nessa outra célula
    e por aí vai.
  • 15:32 - 15:36
    Mas o que é fora da matriz
    da diagonal principal são os erros.
  • 15:36 - 15:37
    E tem muito erro.
  • 15:37 - 15:41
    Tem muita confusão
    entre as classes, ou seja,
  • 15:41 - 15:45
    não foi uma boa rede, não foi
    um bom extrator de características.
  • 15:45 - 15:46
    Podemos fazer melhor?
  • 15:47 - 15:48
    Com certeza.
  • 15:48 - 15:51
    É aí que entra uma estratégia muito
    importante, que é o Transfer Planning
  • 15:52 - 15:53
    Transfer Learning.
  • 15:53 - 15:58
    Eu transfiro o conhecimento de uma rede
    pré treinada para outra tarefa de destino,
  • 15:59 - 16:01
    aproveitando de pesos que foram bem
    escrutinados,
  • 16:01 - 16:04
    foram bem treinados,
    que foram bem construídos e posicionados.
  • 16:05 - 16:06
    Vamos ver como isso funciona.
  • 16:06 - 16:12
    Então, aqui vou começar a trabalhar
    com o transfer lane do modelo BG 16, então
  • 16:12 - 16:16
    eu vou voltar um pouquinho lá nos imports
    para reforçar uma coisa importante
  • 16:17 - 16:21
    se eu vou fazer um transfer da VG 16,
    é ela que eu tenho que importar,
  • 16:21 - 16:24
    Se vou trabalhar com uma outra rede,
    tipo uma marionete?
  • 16:24 - 16:27
    Ela ela seria
    ela queria importar aqui no caso
  • 16:27 - 16:31
    eu estou importando o pré processamento,
    não de uma rede qualquer,
  • 16:31 - 16:34
    mas da rede de 16,
    afinal é essa criatura que me interessa.
  • 16:35 - 16:36
    Dado isso,
  • 16:36 - 16:39
    vamos
    ver o processo de construção do transfer.
  • 16:42 - 16:43
    Pronto,
  • 16:43 - 16:44
    o primeiro passo
  • 16:44 - 16:48
    Eu estou reconstruindo internamente
    o teste e fazendo um pré processamento
  • 16:49 - 16:52
    dos dados de entrada
    do treinamento e do teste.
  • 16:52 - 16:54
    O que esse método faz?
  • 16:54 - 16:57
    Essa pré
    processando essas imagens da sua tarefa
  • 16:57 - 17:00
    na mesma escala daqueles dados grandes
  • 17:00 - 17:03
    que foram utilizados para treinar
    a rede de origem do transfer learning.
  • 17:03 - 17:04
    vamos lá.
  • 17:04 - 17:07
    Aí está o básico
    de fazer uma normalização dos dados
  • 17:07 - 17:12
    de treinamento e teste da nossa tarefa,
    levando os parâmetros de distribuição
  • 17:12 - 17:16
    dos dados que foram utilizados
    para determinar essa rede.
  • 17:17 - 17:19
    Nossa tarefa original.
  • 17:19 - 17:21
    E agora eu vou começar a fazer o transfer.
  • 17:21 - 17:25
    Aí de fato, eu vou criar o novo modelo,
    o modelo de base
  • 17:25 - 17:28
    que ele vem
    tendo de base, vendo que da BGG.
  • 17:29 - 17:31
    Ou seja, eu vou importar os pesos
  • 17:31 - 17:35
    que peso da rede vigente 16 pré treinado?
  • 17:35 - 17:39
    Imaginemos,
    eu vou incluir a tarefa de classificação.
  • 17:39 - 17:43
    As últimas camadas
    não devo defini la para minha tarefa?
  • 17:44 - 17:47
    E qual vai ser o input das imagens?
  • 17:47 - 17:51
    Qual o tamanho das imagens aqui no caso
    e o tamanho do conjunto de treinamento,
  • 17:51 - 17:52
    por exemplo?
  • 17:52 - 17:56
    Pegando o jeito, essa para ser condizente,
    de fato é outra coisa importante.
  • 17:56 - 17:59
    Meu bem, esse módulo é treinado,
    Ele é treinável?
  • 18:00 - 18:02
    Não, não é.
  • 18:02 - 18:03
    O que isso quer dizer?
  • 18:03 - 18:06
    Esse aqui é um ponto muito importante,
    que é a essência do transfer learning.
  • 18:06 - 18:08
    Eu peguei aquela mesma
  • 18:08 - 18:12
    rede, as mesmas camadas,
    copiando os mesmos pesos já pré treinados.
  • 18:12 - 18:14
    Imaginei ET e falei essa rede
    pode aprender.
  • 18:14 - 18:16
    Não, não pode.
  • 18:16 - 18:19
    Assim como você copiou esses pesos,
    mantém como estão
  • 18:19 - 18:24
    e vão utilizar esses pesos pré treinados
    para fazer uma extração de fichas
  • 18:24 - 18:28
    da minha data e meu dado de entrada,
    que é o conjunto de imagens de flores.
  • 18:29 - 18:33
    Eu posso inclusive verificar
    o resumo da arquitetura de base
  • 18:34 - 18:38
    e olha só que interessante,
    bem maior do que a outra é o modelo DDG,
  • 18:38 - 18:41
    então ele parte de um conjunto de entrada,
    no caso aqui
  • 18:41 - 18:45
    já em 150% e 50 pixels em três canais.
  • 18:45 - 18:50
    E aí começam no caso de duas camadas
    convencionais,
  • 18:50 - 18:55
    uma camada e mais duas convencionais,
    outro smartphone e assim sucessivamente.
  • 18:55 - 18:59
    Ou seja, eu não definir nada disso veio
    pronto da BGG.
  • 19:00 - 19:03
    Ele tem um total de mais de
  • 19:03 - 19:09
    14 milhões de parâmetros de pesos
    quando são treinava nenhum.
  • 19:09 - 19:15
    Ou seja, copia e cola
    usa esses pesos já bem avaliados,
  • 19:15 - 19:19
    bem construídos, uma rede bem treinada
    para extrair fichas para notas.
  • 19:19 - 19:20
    Nossa tarefa de destino.
  • 19:22 - 19:24
    O que
    falta fazer é colocar a camada de decisão,
  • 19:24 - 19:27
    porque minha tarefa de classificação
    é outra.
  • 19:27 - 19:31
    Lembra que eu imaginei que nós tínhamos
    20.000 classes, mais de 20.000
  • 19:31 - 19:35
    classes aqui eu tenho só cinco,
    então a decisão vai ser diferente mesmo.
  • 19:35 - 19:38
    Vou definir na camada de decisão,
    inclusive da mesma forma
  • 19:38 - 19:40
    que eu fiz anteriormente.
  • 19:40 - 19:44
    E uma camada de entrada de achatamento
    precisa criar um vetor de fichas,
  • 19:44 - 19:47
    duas camadas densas que são ocultas
  • 19:47 - 19:51
    e uma camada densa também
    com cinco neurônios, também soft max.
  • 19:51 - 19:54
    Ou seja, é a mesma camada do modelo
    feita a mão.
  • 19:54 - 19:57
    Aqui eu só mudei um pouquinho
    o formato fim dele.
  • 19:57 - 20:01
    Olha só, cada camada
    foi salva e uma variável.
  • 20:01 - 20:04
    O meu modelo de fato
    com transfer learning,
  • 20:04 - 20:08
    ele é composto
    do que uma sequência de camadas.
  • 20:08 - 20:11
    Eu tenho várias camadas no meu Buys módulo
  • 20:11 - 20:14
    que veio da BG 16,
    então aquelas várias camadas estão aqui.
  • 20:15 - 20:18
    Passo para uma camada de achatamento
    a camada densa um,
  • 20:18 - 20:21
    a segunda e a última
    é a camada de predição.
  • 20:21 - 20:26
    Pronto, estou com meu modelo
    pronto aqui eu mostro agora o resumo dele.
  • 20:26 - 20:27
    Olha como fica interessante
  • 20:28 - 20:30
    é a Veja 16 funcional.
  • 20:30 - 20:33
    Dizemos isso porque é exatamente
    a mesma arquitetura dela
  • 20:34 - 20:37
    passando para as camadas aqui de decisão.
  • 20:37 - 20:39
    Ele tem mais parâmetros
    ainda para serem aprendidos.
  • 20:39 - 20:42
    Passou de 14 milhões para 15 milhões.
  • 20:42 - 20:45
    Aqui, no caso, são 410.
  • 20:45 - 20:50
    São três novas, porque só quatro de dez
    são três naves, um conjunto de 15 milhões.
  • 20:50 - 20:55
    Porque a maior parte desses conjuntos
    de parâmetros nesses pisos e baias
  • 20:56 - 21:00
    vieram depois dizer já está pronta, já
    treinada, já não é treinável, está fixa.
  • 21:01 - 21:03
    Agora essa parte tem de ser aprendida.
  • 21:03 - 21:05
    É da tarefa de classificação.
  • 21:05 - 21:08
    Então, Então agora tem que compilar
    o modelo também.
  • 21:08 - 21:14
    Ou seja, vou dizer qual o seu otimizador
    Allons a métrica a ser acompanhada.
  • 21:14 - 21:18
    Também vou definir meu stop
    da mesma forma que fiz anteriormente.
  • 21:18 - 21:21
    É aí que eu vou de fato treinar o modelo.
  • 21:21 - 21:23
    note até antes de treinar o modelo.
  • 21:23 - 21:26
    As configurações são as mesmas do modelo
    feito à mão
  • 21:27 - 21:28
    para fazer uma comparação justa.
  • 21:28 - 21:31
    Ou seja, eu mudei a extração da fichas.
  • 21:31 - 21:33
    No primeiro modelo
    eu criei um estrutura de filters
  • 21:33 - 21:36
    feito por mim,
    uma captura que acabei de definir
  • 21:36 - 21:39
    e no segundo modelo
    eu vou utilizar uma extrator de filtros
  • 21:39 - 21:43
    da BG 16 já treinada por muito tempo,
    muito bem
  • 21:43 - 21:47
    construída, em cima de uma base de dados
    muito grande.
  • 21:47 - 21:50
    Agora sim, faço o treinamento
    também utilizando a CPU,
  • 21:51 - 21:55
    então vou treinar com os ensinamentos
    os leigos também para cinco épocas,
  • 21:55 - 21:58
    para ser uma comparação justa,
    mesmo esquema de validação
  • 21:59 - 22:01
    bet size e qual callback vou utilizar?
  • 22:01 - 22:06
    E aqui nós temos a saída também por cinco
    épocas.
  • 22:06 - 22:09
    Novamente essa saída de cinco épocas
  • 22:09 - 22:12
    nos mostram que tem espaço, melhoria.
  • 22:12 - 22:14
    Se eu tivesse deixado mais tempo
    para treinar essa rede,
  • 22:14 - 22:17
    provavelmente o resultado
    ficaria ainda melhor.
  • 22:18 - 22:21
    Notem Alonso está diminuindo a perda.
  • 22:21 - 22:25
    Acurácia está aumentando, A acurácia
    na validação também está aumentando.
  • 22:26 - 22:30
    Ou seja, quanto mais tempo o treinamento
    poderia melhorar, ainda mais.
  • 22:30 - 22:33
    Mas mesmo assim,
    mesmo com apenas cinco épocas,
  • 22:34 - 22:36
    esse modelo, quando avaliado,
  • 22:36 - 22:39
    é o mesmo código na essência.
  • 22:39 - 22:41
    Mas aqui eu estou verificando
  • 22:41 - 22:44
    capacidade preditiva do meu modelo
    feito por transport learning.
  • 22:44 - 22:50
    Olha a minha acurácia subiu para 92,
    ou seja, pensado muito melhor do que eu
  • 22:50 - 22:56
    tinha anteriormente, então eu tinha 54%,
    agora tem 92 inclusive.
  • 22:56 - 22:58
    Notem como ficou me uma grande confusão,
  • 22:58 - 23:01
    com muito mais acertos
    e muito menos erros.
  • 23:02 - 23:05
    Portanto, é modelo muito mais
    bem estável, digamos assim.
  • 23:06 - 23:07
    E qual é
  • 23:07 - 23:10
    de onde vem essa vantagem,
    essa estabilidade, esse poder punitivo,
  • 23:10 - 23:15
    desse modelo de utilizar a força
    do aprendizado de uma rede mais profunda,
  • 23:16 - 23:20
    que foi treinada numa base muito grande
    por muito tempo.
  • 23:21 - 23:26
    Quando nós utilizamos a BG 16
    como um extrator de fichas por modelo,
  • 23:26 - 23:30
    nós nos aproveitamos dos pesos e Bayes
    bem treinados para fazer esse benefício
  • 23:30 - 23:33
    muito mais poderoso
    do que aquele que eu defini anteriormente.
  • 23:33 - 23:36
    Então, só o fato de fazer
    transfer learning já gerou um resultado
  • 23:36 - 23:39
    muito melhor
    do que o modelo treinado do zero.
  • 23:39 - 23:41
    A última criatura é muito mais rasa.
  • 23:41 - 23:42
    Muito bom.
  • 23:42 - 23:46
    Nesse ponto nós temos a diferenciação
    entre treinar o modelo sem ir do zero
  • 23:47 - 23:47
    ou utilizar estratégia
  • 23:47 - 23:51
    de transfer learning para criar modelos
    mais sofisticados, com pouco esforço
  • 23:53 - 23:54
    daria para fazer algo diferente.
  • 23:54 - 23:57
    Sim, dá para combinar
    transfer, learning, coffee tuning.
  • 23:58 - 23:59
    O que isso quer dizer?
  • 23:59 - 24:04
    Quando nós fizemos o transfer Planning,
    nós pegamos a rede pré treinada
  • 24:05 - 24:09
    teve de 16 pontos a camada
    extração de sítios e congelamos os pesos.
  • 24:09 - 24:14
    Nós podemos falar o seguinte olha,
    até certa camada fica congelada.
  • 24:14 - 24:17
    Daí em diante pode refinar um pouquinho
    mais, ou seja, vou fazer um vale
  • 24:17 - 24:21
    tuning,
    um ajuste fino do modelo pré treinado
  • 24:21 - 24:25
    para minha tarefa de destino,
    no caso, classificação de flores.
  • 24:26 - 24:28
    Como nós implementamos isso
    da seguinte forma.
  • 24:28 - 24:32
    Aqui tem que dizer o seguinte
    O meu modelo baseline
  • 24:32 - 24:38
    modelo de base aqui que é uma engine 16,
    ela é treinável porque sim, Mas cuidado,
  • 24:38 - 24:41
    isso equilibraria o treinamento
    de todas as camadas.
  • 24:42 - 24:45
    Aqui eu posso falar o seguinte
    qual camada
  • 24:45 - 24:50
    nós vamos travar o treinamento é o modelo
    possui 19 camadas.
  • 24:51 - 24:54
    Vou fazer um fake tuning na camada
  • 24:54 - 24:59
    13 daí em diante, ou seja,
    eu vou pegar o Benz Model,
  • 24:59 - 25:02
    vou acionar
    quanto layers todas as camadas dele
  • 25:03 - 25:08
    e da primeira
    até esse ponto de corte até 13.ª.
  • 25:08 - 25:11
    Ela é treinável, não?
  • 25:11 - 25:13
    Ou seja, o que nós fizemos?
  • 25:13 - 25:17
    A princípio eu falei o seguinte 19
    camadas, todas são três naves.
  • 25:17 - 25:21
    Depois eu voltei
    corrigindo da primeira até a 13.ª.
  • 25:21 - 25:23
    Ela não é treinável
    não só para ser treinável.
  • 25:23 - 25:27
    A 13.ª em diante até as últimas.
  • 25:27 - 25:30
    Ou seja,
    o ajuste fino está nas últimas camadas.
  • 25:30 - 25:33
    Extração de características
    e porque eu quero fazer isso.
  • 25:33 - 25:37
    Porque eu quero dar liberdade para rede,
    ajustar extração de fichas,
  • 25:38 - 25:43
    não uma base qualquer, grande, robusta,
    como a imaginemos, mas para mim
  • 25:43 - 25:46
    é tarefa de destino, que é simplesmente
    classificar tipos de flores.
  • 25:47 - 25:49
    A partir disso, a gente.
  • 25:49 - 25:51
    Nós definimos também as mesmas camadas.
  • 25:51 - 25:54
    Aquele transfer comentado para falar
    vou utilizar exatamente
  • 25:54 - 25:57
    as que eu tinha anteriormente,
    nem preciso redefinir.
  • 25:58 - 26:00
    É o meu modelo com fine tuning
  • 26:00 - 26:04
    também modelo sequencial, ou seja,
    sai de uma camada para a próxima.
  • 26:04 - 26:08
    Ele parte de base
    modo que nós acabamos de alterar
  • 26:08 - 26:13
    conforme tuning e seguimos aqui
    para a camada de achatamento dos sítios,
  • 26:13 - 26:16
    as camadas ocultas e a camada de decisão.
  • 26:16 - 26:19
    Quando eu exploro o que que é esse resumo?
  • 26:20 - 26:23
    É uma leitura parecida,
    porque também temos aqui
  • 26:23 - 26:26
    a BGG como extrator de fichas
  • 26:26 - 26:29
    e também as camadas aqui de decisão.
  • 26:29 - 26:32
    E depois eu preciso
    fazer os mesmos processo anteriormente,
  • 26:33 - 26:36
    ou seja, não vou entrar detalhes aqui
    é o mesmo processo de comprar o modelo,
  • 26:36 - 26:41
    criar estratégia de stop e aí
    sim vou treinar essa rede.
  • 26:42 - 26:44
    Ou seja, vamos treinar essa
  • 26:44 - 26:49
    ideia do modelo com finitude também,
    com modelo, com condicionamento.
  • 26:49 - 26:54
    Esses leigos mesmo estratégia de épocas,
    mesmo divisão de validação
  • 26:54 - 26:57
    também de eu utilizando o histórico
    também.
  • 26:58 - 27:00
    E aqui, novamente,
    para ser uma comparação justa, eu
  • 27:00 - 27:03
    deixei assim de treinar por cinco épocas
    apenas.
  • 27:04 - 27:07
    De novo a Loss está melhorando
  • 27:07 - 27:11
    a acurácia na validação
    está aumentando também,
  • 27:11 - 27:14
    mas tem chão,
    tem bem espaço aqui para melhorar mais.
  • 27:15 - 27:18
    Se nós estivermos treinados
    para, por exemplo, 50 épocas,
  • 27:18 - 27:20
    porque então as épocas?
  • 27:20 - 27:23
    Quanto mais tempo pode ser
    que tenha refinado,
  • 27:23 - 27:26
    mais e menos tivesse colocado,
    Por exemplo, 5000 épocas.
  • 27:26 - 27:27
    É exagero.
  • 27:27 - 27:31
    A partir do momento que a rede
    percebe que ela não está melhorando mais,
  • 27:31 - 27:36
    o aprendizado, o mecanismo de estoque
    interromperia o treinamento antes
  • 27:36 - 27:41
    mesmo de chegar nesse nível exarcebado
    aqui de épocas, vou manter como cinco.
  • 27:42 - 27:45
    Quando nós testamos isso, nós
  • 27:45 - 27:48
    vemos que para aquele conjunto de teste
    nós temos o quê?
  • 27:48 - 27:49
    Que foi essa?
  • 27:49 - 27:53
    Mas a acurácia foi 62 um.
  • 27:53 - 27:55
    Pode parecer um pouco frustrante
  • 27:55 - 27:58
    porque ficou pior do que o modelo
    transform Learning.
  • 27:59 - 28:02
    Então vamos recapitular um pouquinho
    as métricas que nós temos aqui.
  • 28:02 - 28:05
    O modelo treinado do zero,
    com uma textura profunda,
  • 28:05 - 28:10
    mas não muito rebuscada
    e gerou uma couraça de 54%.
  • 28:11 - 28:14
    O modelo de transfer planning
    jogou esse estado para o 90,
  • 28:15 - 28:19
    mais de 90% de acerto
    e agora o transfer lane com o Facetune
  • 28:19 - 28:22
    e derrubou um pouquinho
    essa performance para 62%.
  • 28:24 - 28:26
    62 é melhor que 54.
  • 28:26 - 28:29
    Ou seja, fazer um transfer lane com tuning
  • 28:29 - 28:32
    é melhor do que treinar uma rede do zero.
  • 28:32 - 28:36
    No entanto, faltou
    tempo para refinar essa rede, ou seja,
  • 28:36 - 28:38
    quando eu vou fazer um transfer learning
  • 28:38 - 28:42
    com fine tuning eu tenho que ajustar
    os pesos, E o que isso quer dizer?
  • 28:42 - 28:44
    Que eu não consigo ajustar
  • 28:44 - 28:48
    todos esses pesos dessa rede profunda
    com apenas cinco épocas,
  • 28:48 - 28:50
    eu precisaria de mais tempo.
  • 28:50 - 28:54
    De fato, de forma geral,
    a medida performance
  • 28:54 - 28:57
    tende a ser, em teoria,
    da seguinte forma você treinar
  • 28:57 - 29:01
    uma rede do zero vai te dar uma resposta,
    uma certa taxa de acerto.
  • 29:01 - 29:04
    Quando você faz transfer learning
    de uma rede profunda,
  • 29:05 - 29:08
    bem treinada,
    esse resultado tende a melhorar bastante.
  • 29:08 - 29:12
    Quando você faz transfer lane
    conforme tune, o resultado melhora
  • 29:12 - 29:13
    um pouquinho mais.
  • 29:13 - 29:18
    Não vai ser um salto de área tão grande
    quanto do modelo simples para o transfer,
  • 29:19 - 29:21
    mas ele melhora um pouquinho.
  • 29:21 - 29:24
    No entanto, para verificarmos
    se é feito na prática, é necessário
  • 29:24 - 29:28
    tempo, ou seja, temos que deixar a rede
    treinando por mais tempo.
  • 29:28 - 29:29
    Portanto, por mais épocas.
Title:
RDAG CAP02 2025 VA06 PYTHON APLICACAO CNN
Video Language:
Portuguese, Brazilian
Duration:
29:33

Portuguese, Brazilian subtitles

Revisions Compare revisions