< Return to Video

RDAG CAP02 2025 VA06 PYTHON APLICACAO CNN

  • 0:08 - 0:10
    Como podemos
    utilizar uma CNN
  • 0:10 - 0:12
    para classificar imagens
    com o deep learning?
  • 0:12 - 0:13
    Nesse momento do curso,
  • 0:13 - 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:32
    inclusive para treinar outros
    tipos de tarefas mais complexas,
  • 0:32 - 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:45
    Sem nos preocuparmos,
    a princípio, onde eles estão,
  • 0:45 - 0:47
    em qual posição da imagem
    eles estão, também,
  • 0:47 - 0:50
    o fato é saber a qual classe
    essa imagem pertence.
  • 0:50 - 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, eu 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:27
    testarem com outros parâmetros
    e verificarem o impacto disso
  • 1:27 - 1:29
    em tempo de execução
    e, também, nos resultados.
  • 1:29 - 1:32
    A primeira tarefa a ser executada
    aqui é esse "pip install"
  • 1:32 - 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:49
    pode haver alguma incompatibilidade
    entre o código da versão antiga
  • 1:49 - 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:58
    nós evitamos esse
    tipo de problema.
  • 1:58 - 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 estamos 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:54
    Esse erro aqui é natural, faz parte
    do processo de tentativa e erro.
  • 2:54 - 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:33
    Seaborn para fazer
    alguns gráficos também.
  • 3:33 - 3:37
    Da parte do sklearn, vamos
    importar a matriz de confusão
  • 3:37 - 3:39
    para exibir melhor
    os resultados.
  • 3:39 - 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:53
    então redes sequenciais,
    as camadas
  • 3:53 - 3:57
    das camadas, vamos importar várias
    camadas que existem também.
  • 3:57 - 3:59
    O mecanismo
    de Early Stopping,
  • 3:59 - 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:26
    mas guarde essa informação,
    porque vamos voltar logo, logo,
  • 4:26 - 4:28
    quando falarmos
    de transfer learning.
  • 4:28 - 4:33
    Pois bem, então temos, aqui,
    as camadas, os modelos específicos,
  • 4:33 - 4:36
    e, agora, a gente começa
    com o código de verdade.
  • 4:36 - 4:38
    A primeira parte do nosso
    código, essa célula aqui,
  • 4:38 - 4:41
    é para carregar o dataset
    para memória, ou seja,
  • 4:41 - 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:05
    e ele já vai carregar para gente
    uma divisão em duas tuplas:
  • 5:05 - 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:37
    então o meu arquivo de treino
    ele tem duas 2.569 imagens
  • 5:37 - 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:03
    Agora, a gente começa
    pré-processando esses dados.
  • 6:03 - 6:04
    Estou dizendo o seguinte:
  • 6:04 - 6:07
    eu vou trabalhar com
    o tamanho de 150 por 150.
  • 6:07 - 6:11
    Ou seja, eu não vou trabalhar
    com a imagem no tamanho original,
  • 6:11 - 6:15
    eu 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:22
    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:35
    ou uma orquídea, ou qualquer
    outro tipo de flor também.
  • 6:35 - 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 treinamento quanto o teste,
  • 6:48 - 6:51
    e gerando novos dados,
    digamos assim, já reescalados.
  • 6:51 - 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:08
    cada, label vai ser um vetorzinho
    com 5 posições,
  • 7:08 - 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 reescaladas
    em 150 por 150 pixels,
  • 7:26 - 7:29
    e também continuam
    expressas em três canais, RGB.
  • 7:29 - 7:32
    E o label fica exatamente
    como tinha previsto.
  • 7:32 - 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:52
    Então, eu vou fazer o primeiro
    modelo treinando do zero,
  • 7:52 - 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:04
    e vou treinar, do zero,
    como posicionar esses pesos
  • 8:04 - 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:22
    Nós sabemos que, para
    definir o modelo profundo,
  • 8:22 - 8:25
    nós temos que definir
    a arquitetura desse modelo.
  • 8:25 - 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:31
    para a próxima,
    para a próxima.
  • 8:31 - 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:48
    desenhada uma arquitetura a mão.
  • 8:48 - 8:52
    Então, vamos lá, eu vou desenhar
    a mão essa arquitetura.
  • 8:52 - 8:55
    Ela é sequencial, ela começa
    e eu vou adicionando camadas.
  • 8:55 - 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:08
    Por que a gente
    vai fazer isso?
  • 9:08 - 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:17
    eu estou levando
    os dados da matriz,
  • 9:17 - 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:28
    onde posicionar esses pesos
    que modelam esse problema.
  • 9:28 - 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:43
    e um kernel de tamanho 10,
    essa janela deslizante.
  • 9:43 - 9:46
    E vou engatar, aqui,
    uma camada de max pooling.
  • 9:46 - 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:57
    e, pronto, terminei aqui
    a minha arquitetura CNN.
  • 9:57 - 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:10
    mas eu fiz uma camada
    de extração de features.
  • 10:10 - 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:31
    Poderia, cada arquitetura
    tem as suas possibilidades
  • 10:31 - 10:34
    de serem construídas
    com vantagens e desvantagens.
  • 10:34 - 10:36
    Aqui, eu quis criar
    uma arquitetura simples.
  • 10:36 - 10:40
    Dada essa parte de extração,
    vamos a parte de decisão,
  • 10:40 - 10:42
    ou seja, quando nós saímos
    dessa última camada,
  • 10:42 - 10:44
    nós temos uma feature pronta.
  • 10:44 - 10:47
    Vamos, então,
    alimentar essa feature,
  • 10:47 - 10:49
    extrair dos dados
    de entrada,
  • 10:49 - 10:52
    para fazer a classificação
    do modelo.
  • 10:52 - 10:55
    E eu vou começar com uma camada
    de achatamento, ou seja,
  • 10:55 - 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 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 ativado
    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:44
    caso tenha alguma
    confusão entre as classes,
  • 11:44 - 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:06
    qual vai ser a métrica que eu
    vou otimizar também.
  • 12:06 - 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:26
    eu vou resgatar
    os melhores pesos.
  • 12:26 - 12:27
    O que isso quer
    dizer, gente?
  • 12:27 - 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:34
    os acertos e os erros.
  • 12:34 - 12:39
    Eu estou avaliando
    a acurácia da validação.
  • 12:39 - 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:48
    por 5 épocas consecutivas, eu vou
    parar o treinamento aí mesmo.
  • 12:48 - 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:55
    E, depois que eu defino
    todas as estratégias,
  • 12:55 - 12:59
    aí sim, eu vou fazer
    o treinamento, fitting,
  • 12:59 - 13:02
    do meu modelo, modelo
    aqui treinado na mão,
  • 13:02 - 13:05
    definindo na mão, de fato,
    utilizando uma GPU.
  • 13:05 - 13:08
    Aqui, eu vou treinar utilizando
    o dado treinamento
  • 13:08 - 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:38
    Tem algo que modifica
    esse treinamento?
  • 13:38 - 13:41
    Sim, uma estratégia
    de early stopping.
  • 13:41 - 13:43
    Note que aqui já
    está executado,
  • 13:43 - 13:45
    então ele foi executando
    a primeira época,
  • 13:45 - 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 em que a rede
    está treinada, temos que avaliá-la,
  • 14:24 - 14:26
    então eu vou dar
    um ".evaluate"
  • 14:26 - 14:29
    passando dados
    e os labels de teste,
  • 14:29 - 14:32
    indicando qual vai ser a loss
    e qual vai ser a acurácia.
  • 14:32 - 14:38
    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:46
    mas aprendeu pouco,
    ou seja, tem chance,
  • 14:46 - 14:49
    tem chão para poder
    conseguir aprender mais.
  • 14:49 - 14:52
    Só que como nós treinamos
    por pouco tempo,
  • 14:52 - 14:53
    o máximo que ela
    conseguiu aprender
  • 14:53 - 14:59
    foi para conseguir fazer
    esse tipo de acerto, 54%.
  • 14:59 - 15:02
    No entanto, a acurácia pode ser
    uma métrica global meio vaga.
  • 15:02 - 15:06
    Ok, ela acertou
    54% no teste,
  • 15:06 - 15:09
    mas será que ela acertou mais
    de uma classe, mais 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 plotada,
  • 15:14 - 15:20
    e olhem só a distribuição
    dos dados de teste nessa matriz.
  • 15:20 - 15:23
    Lembrem que a diagonal
    principal são os acertos,
  • 15:23 - 15:31
    Então, temos 220 acertos aqui,
    33 aqui, 130 nessa outra célula
  • 15:31 - 15:32
    e por aí vai.
  • 15:32 - 15:36
    Mas o que é fora da diagonal
    principal são os erros,
  • 15:36 - 15:40
    e tem muito erro, tem muita
    confusão entre as classes.
  • 15:40 - 15:43
    Ou seja, não foi
    uma boa rede,
  • 15:43 - 15:45
    não foi um bom extrator
    de características.
  • 15:45 - 15:47
    Podemos fazer melhor?
  • 15:47 - 15:48
    Com certeza.
  • 15:48 - 15:50
    E é aí que entra uma estratégia
    muito importante,
  • 15:50 - 15:52
    que é o transfer learning.
  • 15:52 - 15:53
    No transfer learning,
  • 15:53 - 15:57
    eu transfiro o conhecimento
    de uma rede pré-treinada
  • 15:57 - 15:58
    para outra tarefa de destino,
  • 15:58 - 16:02
    aproveitando pesos que foram bem
    escrutinados, foram bem treinados,
  • 16:02 - 16:05
    que foram bem construídos
    e posicionados.
  • 16:05 - 16:06
    Vamos ver
    como isso funciona.
  • 16:06 - 16:09
    Então, aqui, vou começar
    a trabalhar com o transfer learning
  • 16:09 - 16:11
    do modelo VGG16.
  • 16:11 - 16:14
    Então, note, eu vou voltar
    um pouquinho lá nos imports
  • 16:14 - 16:16
    para reforçar
    uma coisa importante.
  • 16:17 - 16:20
    Se eu vou fazer
    um transfer da VGG16,
  • 16:20 - 16:21
    é ela que eu tenho
    que importar,
  • 16:21 - 16:25
    se vou trabalhar com uma outra
    rede, tipo uma ______,
  • 16:25 - 16:27
    seria ela que iria
    importar aqui no caso.
  • 16:27 - 16:29
    E eu estou importando
    o pré-processamento
  • 16:29 - 16:32
    não de uma rede qualquer,
    mas da VGG 16,
  • 16:32 - 16:35
    afinal, é essa a arquitetura
    que me interessa.
  • 16:35 - 16:40
    Dado isso, vamos ver o processo
    de construção do transfer learning.
  • 16:42 - 16:44
    Pronto, primeiro passo:
  • 16:44 - 16:47
    eu estou reconstruindo
    o treinamento de teste
  • 16:47 - 16:48
    fazendo um pré-processamento
  • 16:48 - 16:52
    dos dados de entrada
    do treinamento e de teste.
  • 16:52 - 16:53
    O que esse método faz?
  • 16:53 - 16:57
    Ele está pré-processando
    essas imagens da sua tarefa
  • 16:57 - 17:00
    na mesma escala
    daqueles dados grandes
  • 17:00 - 17:02
    que foram utilizados para
    treinar a rede de origem
  • 17:02 - 17:03
    do transfer learning.
  • 17:03 - 17:05
    Então, vamos lá, a gente
    está, basicamente,
  • 17:05 - 17:07
    fazendo uma normalização
    dos dados de treinamento
  • 17:07 - 17:10
    e teste da nossa tarefa,
  • 17:10 - 17:13
    levando-os para a mesma
    distribuição dos dados
  • 17:13 - 17:17
    que foram utilizados
    para pré-treinar essa rede,
  • 17:17 - 17:18
    nossa tarefa original.
  • 17:18 - 17:22
    E, agora, eu vou começar a fazer
    o transfer learning de fato.
  • 17:22 - 17:25
    Eu vou criar, aqui, o novo
    modelo, o modelo de base,
  • 17:25 - 17:27
    que vem do quê?
  • 17:27 - 17:31
    Da VGG16, ou seja, eu
    vou importar os pesos.
  • 17:31 - 17:32
    Que pesos?
  • 17:32 - 17:36
    Da rede VGG16 pré-treinada
    no ImageNet.
  • 17:36 - 17:39
    Eu vou incluir a tarefa
    de classificação,
  • 17:39 - 17:40
    as últimas camadas?
  • 17:40 - 17:44
    Não, eu vou defini-la
    para a minha tarefa.
  • 17:44 - 17:47
    E qual vai ser o input
    das imagens?
  • 17:47 - 17:49
    Qual o tamanho das imagens
    aqui no caso?
  • 17:49 - 17:51
    É o tamanho do conjunto
    de treinamento, por exemplo,
  • 17:51 - 17:55
    pegando o "shape", só para
    ser condizente, de fato.
  • 17:55 - 17:56
    E outra coisa importante:
  • 17:56 - 17:58
    O meu base model
    é "trainable"?
  • 17:58 - 18:00
    Ele é treinável?
  • 18:00 - 18:02
    Não, não é.
  • 18:02 - 18:03
    O que isso quer dizer?
  • 18:03 - 18:04
    Esse aqui é um ponto
    muito importante,
  • 18:04 - 18:06
    que é a essência
    do transfer learning.
  • 18:06 - 18:09
    Eu peguei aquela mesma
    rede, as mesmas camadas,
  • 18:09 - 18:12
    copiando os mesmos pesos
    já pré-treinados no ImageNet,
  • 18:12 - 18:14
    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, mantenha como estão
  • 18:19 - 18:21
    e vamos utilizar esses
    pesos pré-treinados
  • 18:21 - 18:26
    para fazer uma extração de features
    do meu dado de entrada,
  • 18:26 - 18:28
    que é o conjunto, aqui,
    de imagens de flores.
  • 18:28 - 18:33
    Eu posso, inclusive, verificar
    o resumo da arquitetura de base.
  • 18:33 - 18:36
    E, olha só que interessante,
    é bem maior do que a outra,
  • 18:36 - 18:38
    é o modelo VGG16.
  • 18:38 - 18:40
    Então, ele parte
    de um conjunto de entrada,
  • 18:40 - 18:45
    no caso aqui, já em 150
    por 150 pixels em 3 canais.
  • 18:45 - 18:49
    E aí, começam, no caso do VGG16,
    duas camadas convolucionais,
  • 18:49 - 18:52
    uma camada de max pooling,
    duas convolucionais,
  • 18:52 - 18:55
    outro max pooling
    e assim sucessivamente.
  • 18:55 - 19:00
    Ou seja, eu não definir nada
    disso, veio pronto da VGG16.
  • 19:00 - 19:06
    Ele tem um total de mais
    de 14 milhões de parâmetros,
  • 19:06 - 19:07
    de pesos.
  • 19:07 - 19:08
    Quantos são treináveis?
  • 19:08 - 19:15
    Nenhum, ou seja, copia e cola,
    usa esses pesos já bem avaliados,
  • 19:15 - 19:17
    bem construídos,
    uma rede bem treinada
  • 19:17 - 19:20
    para extrair features para
    nossa tarefa de destino.
  • 19:21 - 19:22
    O que falta fazer?
  • 19:22 - 19:24
    Colocar a camada de decisão,
  • 19:24 - 19:27
    porque minha tarefa
    de classificação é outra.
  • 19:27 - 19:30
    Lembra que, no ImageNet,
    nós tínhamos 20 mil classes,
  • 19:30 - 19:32
    mais de 20 mil classes,
    aqui eu tenho só 5,
  • 19:32 - 19:35
    então a minha camada de decisão
    vai ser diferente mesmo.
  • 19:35 - 19:37
    Vou definir minha
    camada de decisão,
  • 19:37 - 19:40
    inclusive, da mesma forma
    que eu fiz anteriormente.
  • 19:40 - 19:42
    É uma camada de entrada
    de achatamento,
  • 19:42 - 19:44
    ou seja, criar
    um vetor de features,
  • 19:44 - 19:46
    duas camadas densas
    que são ocultas
  • 19:46 - 19:51
    e uma camada densa, também,
    com 5 neurônios, também softmax.
  • 19:51 - 19:54
    Ou seja, é a mesma camada
    do modelo feita à mão,
  • 19:54 - 19:57
    aqui eu só mudei um pouquinho
    o formatinho dele.
  • 19:57 - 20:01
    Olha só, cada camada
    foi salva em uma variável.
  • 20:01 - 20:04
    O meu modelo, de fato,
    com o transfer learning,
  • 20:04 - 20:05
    é composto do quê?
  • 20:05 - 20:08
    Uma sequência de camadas.
  • 20:08 - 20:10
    Eu tenho várias camadas
    no meu base model,
  • 20:10 - 20:15
    que veio da VGG16, então aquelas
    várias camadas estão aqui,
  • 20:15 - 20:16
    eu passo para uma camada
    de achatamento,
  • 20:16 - 20:21
    a camada densa um, a segunda,
    e a última, e a camada de predição.
  • 20:21 - 20:24
    Pronto, estou com meu
    modelo pronto aqui.
  • 20:24 - 20:27
    Se eu mostro, agora, o resumo
    dele, olha como fica interessante:
  • 20:28 - 20:30
    é a VGG16 funcional.
  • 20:30 - 20:34
    Dizemos isso, porque é exatamente
    a mesma arquitetura dela,
  • 20:34 - 20:36
    passando pelas
    camadas de decisão.
  • 20:36 - 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:47
    Aqui, no caso, 410
    são treináveis.
  • 20:47 - 20:50
    Por que só 410 são treináveis
    em um conjunto de 15 milhões?
  • 20:50 - 20:54
    Porque a maior parte desses
    conjuntos de parâmetros,
  • 20:54 - 20:58
    desses pesos e baias, vieram
    da VGG16, que já está pronta,
  • 20:58 - 21:01
    já não é treinável, está fixa.
  • 21:01 - 21:06
    Agora, essa parte de ser aprendida
    é da tarefa de classificação.
  • 21:06 - 21:08
    Então, agora, eu tenho
    que compilar o modelo também,
  • 21:08 - 21:10
    ou seja, vou dizer qual
    vai ser o otimizador,
  • 21:10 - 21:14
    a loss, a métrica
    a ser acompanhada,
  • 21:14 - 21:16
    também vou definir
    meu early stopping,
  • 21:16 - 21:18
    da mesma forma que eu
    fiz anteriormente,
  • 21:18 - 21:21
    e é 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:26 - 21:28
    para fazer uma comparação justa.
  • 21:28 - 21:31
    Ou seja, eu mudei
    a extração das features
  • 21:31 - 21:33
    No primeiro modelo, eu criei
    um extrator de features,
  • 21:33 - 21:36
    feito por mim, uma arquitetura
    que eu acabei de definir,
  • 21:36 - 21:39
    e, no segundo modelo, eu vou
    utilizar um extrator de features
  • 21:39 - 21:43
    da VGG16 já treinada
    por muito tempo,
  • 21:43 - 21:45
    muito bem construída
    em cima do ImageNet,
  • 21:45 - 21:47
    uma base de dados
    muito grande.
  • 21:47 - 21:51
    Agora sim, eu faço o treinamento
    também utilizando a GPU.
  • 21:51 - 21:54
    então vou treinar com os dados
    do treinamento, seus labels,
  • 21:54 - 21:57
    também para 5 épocas,
    para ser uma comparação justa,
  • 21:57 - 21:59
    mesmo esquema
    de validação, batch size
  • 21:59 - 22:01
    e qual callback vou utilizar.
  • 22:01 - 22:06
    E, aqui, nós temos a saída,
    também por 5 épocas.
  • 22:06 - 22:09
    Novamente, essa
    saída de 5 épocas
  • 22:09 - 22:11
    nos mostra que tem
    espaço para melhoria.
  • 22:11 - 22:14
    Se eu tivesse deixado mais
    tempo para treinar essa rede,
  • 22:14 - 22:18
    provavelmente o resultado
    ficaria ainda melhor, notem.
  • 22:18 - 22:23
    A loss está diminuindo, a perda,
    a acurácia está aumentando,
  • 22:23 - 22:26
    a acurácia na validação
    também está aumentando.
  • 22:26 - 22:28
    Ou seja, com mais
    tempo de treinamento,
  • 22:28 - 22:30
    poderia melhorar ainda mais.
  • 22:30 - 22:33
    Mas, mesmo assim, mesmo
    com apenas 5 épocas,
  • 22:33 - 22:38
    esse modelo, quando avaliado,
    é o mesmo código na essência.
  • 22:38 - 22:42
    Mas, aqui, eu estou verificando
    a capacidade preditiva
  • 22:42 - 22:44
    do meu modelo feito
    por transfer learning.
  • 22:44 - 22:48
    Olha a minha acurácia,
    subiu para 92.
  • 22:48 - 22:51
    Ou seja, é um resultado muito melhor
    do que eu tinha anteriormente.
  • 22:51 - 22:54
    Antes, eu tinha 54%,
    agora, eu tenho 92.
  • 22:54 - 22:58
    Inclusive, notem como ficou
    minha matriz de confusão:
  • 22:58 - 23:02
    com muito mais acertos
    e muito menos erros.
  • 23:02 - 23:06
    Portanto, é modelo muito
    mais estável, digamos assim.
  • 23:06 - 23:09
    E de onde vem essa vantagem
    dessa estabilidade,
  • 23:09 - 23:11
    desse poder preditivo
    desse modelo?
  • 23:11 - 23:16
    De utilizar a força do aprendizado
    de uma rede mais profunda,
  • 23:16 - 23:20
    que foi treinada em uma base
    muito grande por muito tempo.
  • 23:20 - 23:25
    Quando nós utilizamos a VGG16 como
    um extrator de features para o modelo,
  • 23:25 - 23:29
    nós nos aproveitamos dos pesos
    e baias bem treinados
  • 23:29 - 23:31
    para fazer um extrator de features
    muito mais poderoso
  • 23:31 - 23:33
    do que aquele que eu
    defini anteriormente.
  • 23:33 - 23:35
    Então, só o fato de fazer
    transfer learning
  • 23:35 - 23:39
    já gerou um resultado muito melhor
    do que o modelo treinado do zero
  • 23:39 - 23:41
    a partir de uma arquitetura
    muito mais rasa.
  • 23:41 - 23:44
    Muito bom, nesse ponto,
    nós temos a diferenciação
  • 23:44 - 23:46
    entre treinar o modelo
    CNN do zero
  • 23:46 - 23:48
    ou utilizar uma estratégia
    de transfer learning
  • 23:48 - 23:52
    para criar modelos mais
    sofisticados, com pouco esforço.
  • 23:52 - 23:54
    Daria para fazer
    algo diferente?
  • 23:54 - 23:57
    Sim, dá para combinar transfer
    learning com fine-tuning.
  • 23:57 - 23:59
    O que isso quer dizer?
  • 23:59 - 24:01
    Quando nós fizemos
    o transfer learning,
  • 24:01 - 24:05
    nós pegamos a rede
    pré-treinada da VGG16,
  • 24:05 - 24:09
    tudo da camada de extração
    de features, e congelamos os pesos.
  • 24:09 - 24:14
    Nós podemos falar o seguinte:
    até certa camada fica congelada,
  • 24:14 - 24:16
    daí em diante, pode refinar
    um pouquinho mais.
  • 24:16 - 24:21
    Ou seja, vou fazer um fine-tuning,
    um ajuste fino do modelo pré-treinado
  • 24:21 - 24:25
    para a minha tarefa de destino,
    no caso, a classificação de flores.
  • 24:25 - 24:27
    Como nós implementamos isso?
  • 24:27 - 24:28
    Da seguinte forma:
  • 24:28 - 24:30
    aqui, eu tenho
    que dizer o seguinte:
  • 24:30 - 24:33
    o meu modelo baseline,
    modelo de base aqui,
  • 24:33 - 24:36
    que é o VGG16,
    é treinável?
  • 24:36 - 24:38
    Está falando que sim,
    mas cuidado,
  • 24:38 - 24:42
    isso aqui liberaria o treinamento
    de todas as camadas.
  • 24:42 - 24:44
    Aqui, eu posso
    falar o seguinte:
  • 24:44 - 24:48
    em qual camada nós vamos
    travar o treinamento?
  • 24:48 - 24:51
    O modelo possui 19 camadas,
  • 24:51 - 24:56
    vou fazer um fine-tuning
    na camada 13 em diante.
  • 24:56 - 24:59
    Ou seja, eu vou pegar
    o base model,
  • 24:59 - 25:02
    vou acionar ".layers",
    todas as camadas dele,
  • 25:02 - 25:08
    e, da primeira até esse
    ponto de corte, até a 13ª,
  • 25:08 - 25:10
    ela é treinável?
  • 25:10 - 25:13
    Não, ou seja, o que
    nós fizemos?
  • 25:13 - 25:17
    A princípio eu falei o seguinte:
    19 camadas, todas são treináveis.
  • 25:17 - 25:22
    Depois, eu voltei corrigindo: da 1ª
    até a 13ª, ela não é treinável não,
  • 25:22 - 25:27
    só vai ser treinável da 13ª
    em diante, até as últimas.
  • 25:27 - 25:30
    Ou seja, o ajuste fino está
    nas últimas camadas
  • 25:30 - 25:31
    de extração de características.
  • 25:31 - 25:33
    E por que eu
    quero fazer isso?
  • 25:33 - 25:35
    Porque eu quero dar
    liberdade para rede
  • 25:35 - 25:39
    ajustar a extração de features
    não para uma base qualquer,
  • 25:39 - 25:42
    grande, robusta,
    como a ImageNet,
  • 25:42 - 25:43
    mas para a minha
    tarefa de destino,
  • 25:43 - 25:47
    que é, simplesmente,
    classificar tipos de flores.
  • 25:47 - 25:51
    A partir disso, nós definimos,
    também, as mesmas camadas,
  • 25:51 - 25:52
    aqui até deixei comentado
  • 25:52 - 25:56
    para falar: vou utilizar exatamente
    as que eu tinha anteriormente,
  • 25:56 - 25:57
    nem preciso redefinir.
  • 25:57 - 26:01
    E o meu modelo com fine-tuning
    também é um modelo sequencial,
  • 26:01 - 26:04
    ou seja, sai de uma camada
    para a próxima,
  • 26:04 - 26:09
    ele parte de base model, que nós
    acabamos de alterar com fine-tuning,
  • 26:09 - 26:13
    e seguimos aqui para a camada
    de achatamento das features,
  • 26:13 - 26:16
    as camadas ocultas
    e a camada de decisão.
  • 26:16 - 26:19
    Quando eu exploro
    o que é esse resumo,
  • 26:19 - 26:23
    é uma arquitetura parecida,
    porque também temos, aqui,
  • 26:23 - 26:29
    a VGG16 como extratora de features
    e, também, as camadas de decisão.
  • 26:29 - 26:33
    E, depois, eu preciso fazer os mesmos
    processos de anteriormente.
  • 26:33 - 26:35
    Ou seja, não vou entrar
    em detalhes aqui,
  • 26:35 - 26:36
    é o mesmo processo
    de compilar o modelo,
  • 26:36 - 26:41
    criar estratégia de early stopping
    e, aí sim, vou treinar essa rede.
  • 26:42 - 26:46
    Ou seja, vamos treinar essa rede,
    agora do modelo com fine-tuning,
  • 26:46 - 26:50
    também com o modelo com o ____
    de treinamento e seus labels,
  • 26:50 - 26:54
    mesma estratégia de épocas,
    mesma divisão de validação,
  • 26:54 - 26:57
    também de batch, e utilizando
    o early stopping também.
  • 26:57 - 27:00
    E aqui, novamente, para se
    ter uma comparação justa,
  • 27:00 - 27:04
    eu deixei _____ treinar
    por 5 é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 espaço
    aqui para melhorar mais
  • 27:14 - 27:18
    se nós tivéssemos treinado
    por, por exemplo, 50 épocas,
  • 27:18 - 27:20
    por 500 épocas.
  • 27:20 - 27:24
    Quanto mais tempo, pode ser
    que ele teria refinado mais
  • 27:24 - 27:28
    e, mesmo que eu tivesse colocado,
    por exemplo, 5000 épocas, um exagero,
  • 27:28 - 27:30
    a partir do momento
    que a rede percebe
  • 27:30 - 27:33
    que ela não está melhorando
    mais o aprendizado,
  • 27:33 - 27:36
    o mecanismo de early stopping
    interromperia o treinamento
  • 27:36 - 27:40
    antes mesmo de chegar nesse
    número exarcerbado de épocas.
  • 27:40 - 27:42
    Vou manter como 5.
  • 27:42 - 27:44
    Quando nós testamos isso,
  • 27:44 - 27:47
    nós vemos que, para aquele conjunto
    de teste, nós temos o quê?
  • 27:47 - 27:52
    Que a loss foi essa,
    mas a acurácia foi 62.
  • 27:52 - 27:55
    Hm, pode parecer
    um pouco frustrante,
  • 27:55 - 27:58
    porque ficou pior que o modelo
    de transfer learning.
  • 27:58 - 28:00
    Então, vamos recapitular
    um pouquinho
  • 28:00 - 28:02
    as métricas que nós
    temos aqui.
  • 28:02 - 28:05
    O modelo treinado do zero,
    com uma arquitetura profunda,
  • 28:05 - 28:11
    mas não muito rebuscada,
    gerou uma couraça de 54%.
  • 28:11 - 28:12
    O modelo de transfer learning
  • 28:12 - 28:16
    jogou esse resultado para
    mais de 90% de acerto.
  • 28:16 - 28:19
    E, agora, o transfer learning
    com o fine-tuning
  • 28:19 - 28:23
    derrubou um pouquinho
    essa performance para 62%.
  • 28:23 - 28:28
    62 é melhor que 54, ou seja, fazer
    um transfer learning com fine-tuning
  • 28:28 - 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:39
    quando eu vou fazer um transfer
    learning com fine-tuning,
  • 28:39 - 28:41
    eu tenho que ajustar os pesos.
  • 28:41 - 28:42
    E o que isso quer dizer?
  • 28:42 - 28:46
    Que eu não consigo ajustar todos
    esses pesos dessa rede profunda
  • 28:46 - 28:51
    com apenas 5 épocas, eu
    precisaria de mais tempo, de fato.
  • 28:51 - 28:54
    De forma geral, a maioria
    da performance tende a ser,
  • 28:54 - 28:56
    em teoria, da seguinte forma:
  • 28:56 - 28:59
    você treinar uma rede do zero
    vai te dar uma resposta,
  • 28:59 - 29:01
    uma certa taxa de acerto.
  • 29:01 - 29:06
    Quando você faz transfer learning
    de uma rede profunda, bem treinada,
  • 29:06 - 29:08
    esse resultado tende
    a melhorar bastante.
  • 29:08 - 29:11
    Quando você faz transfer
    learning com fine-tuning,
  • 29:11 - 29:13
    o resultado melhora
    um pouquinho mais.
  • 29:13 - 29:15
    Não vai ser um salto
    de melhoria tão grande
  • 29:15 - 29:19
    quanto do modelo
    simples para o transfer,
  • 29:19 - 29:21
    mas ele melhora
    um pouquinho.
  • 29:21 - 29:24
    No entanto, para verificarmos
    seu efeito na prática,
  • 29:24 - 29:25
    é necessário tempo, ou seja,
  • 29:25 - 29:28
    temos que deixar a rede
    treinando por mais tempo,
  • 29:28 - 29:30
    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