Deep Learning::Aprendizado por Transferência e Ajuste Fino

Como reaproveitar redes pré-treinadas para novas tarefas?

Tutoriais e Explanações

As duas técnicas servem para você aproveitar uma rede pronta e usá-la em um novo domínio de aplicação, retreinando parte dela.

Aprendizado por Transferência

transfer-learning

No aprendizado por transferência você apenas retira os camadas que não deseja de uma rede pronta e coloca novas camadas sobre esta rede. Você vai treinar apenas estas novas camadas. Uma estratégia bastante eficiente para esse treinamento é você deixar as duas redes separadas e simplesmente passar todos os padrões de treinamento e de validação uma vez apenas pela “parte de baixo” da rede (a parte que você não vai modificar), guardar a resposta da rede “velha” para cada uma destes padrões e usar estas respostas como entradas para treinar apenas as novas camadas de “topo” que você adicionou à saída da rede. Isso economiza uma quantidade enorme de processamento, pois a “parte de baixo” da rede (provavelmente aquela que é de longe a mais complexa) só vai processar cada padrão uma única vez.  A desvantagem é que você necessita de memória adicional para armazenar estes padrões de saída: se a camada de saída dessa rede truncada que você criou possuir 4096 neurônios, então você vai ter de armazenar n padrões de dimensão 1 x 4096 onde n é o tamanho do conjunto de treinamento…  Esta estratégia está demonstrada no exemplo de Satya Mallick abaixo: a instância de Model criada engloba apenas duas camadas para treinar. 

  1. The Keras Blog: Building powerful image classification models using very little data
  2. Satya Mallick: Keras Tutorial : Transfer Learning using pre-trained models
  3. TensorFlow: How to Retrain an Image Classifier for New Categories
    1. Codelab: TensorFlow For Poets
  4. Towards Data Science::Transfer Learning — part 1

Ajuste Fino

No ajuste fino você toma uma rede pré-treinada para usar como a “parte de baixo” de uma nova rede, eliminando as camadas de classificação e de saída. Você então escolhe quais camadas da rede velha você vai “congelar” e quais você vai deixar treináveis.  Aí você completa esta rede, adicionando novas camadas de classificação e de saída a ela.  O processo de treinamento vai refinar as camadas da rede velha que você deixou treináveis e treinar do zero as camadas novas. No ajuste fino você tem de passar todos os padrões de treinamento no mínimo por todas as camadas treináveis dessa sua rede composta. É um processo bem mais demorado que o aprendizado por transferência.

O que mais eu necessito?

  1. Ferramentas de anotação: se você vai adaptar redes de Detecção de Objetos em Imagens ou de Segmentação Semântica você vai necessitar das ferramentas na nossa página de Deep Learning::Ensinando à Rede: Ferramentas de Anotação.

Usando Keras

Aqui há vários tutoriais com diferentes focos e graus de aprofundamento. Alguns confundem o conceito de transfer learning com o conceito de fine tuning. Atenha-se às definições acima e ignore pequenos erros de blogueiros ávidos. A melhor estratégia ocm os posts abaixo é dar uma olhada em todos e escolher dois ou três para fazer. Eu pessoalmente gosto do enfoque pragmático do Satya Mallick…

  1. The Keras Blog: Building powerful image classification models using very little data
  2. Satya Mallick: Keras Tutorial : Fine-tuning using pre-trained models
  3. Medium: Transfer Learning using Keras (na verdade este é um tutorial de ajuste fino…)
  4. Keras » Docs » Applications (possui um excelente exemplo de código para você primeiro criar uma rede com aprendizado por transferência, colocando um novo topo nela e treinando por um tempo e, depois, usar esse resultado abrindo algumas camadas para treinar e realizando uma segunda etapa de treinamento onde você faz ajuste fino da rede treinando mais camadas)
  5. Towards Data Science::Keras Transfer Learning For Beginners
  6. Towards Data Science::Transfer learning from pre-trained models
  7. engMRK::Keras Application for Pre-trained Model 
  8. TensorFlow: Fine-Tuning 
  9. Medium::Transfer Leaning – How a Pre-Trained CNN could be used as a Feature Extractor
  10. A Comprehensive guide to Fine-tuning Deep Learning Models in Keras
    1. Parte I
    2. Parte II

Usando PyTorch a fast.ai

Para os pytorchies, uma comunidade crescente mas ainda restrita a pesquisadores mais hardcore, o fast.ai tem revolucionado o ensino de CNNs com um enfoque prático, pragmático e hands-on, sem muita teoria. Os melhores tutoriais com PyTorch tem aparecido por lá…

Comentário: Após bastante uso de fast.ai fica a impressão de que foi uma coisa construída bastante às pressas para resolver um problema (= programadores que não tem nenhuma noção de Deep Learning mas necessitam produzir resultados rápido). fast.ai possui uma quantidade grande de recursos de otimização de extremo alto nível que são excelente, mas a documentação é absolutamente inexistente. Existem os vídeos do curso (linkados abaixo) e existem blogs de usuários que falam como fizeram. Não há manual de usuário e nem manual de referência.  Estamos tentando juntar bons blogs abaixo para você poder usufruir da experiência de outros. Consulte também nossa página de Deep Learning::Usando a Nuvem para seus Trabalhos para ver Jupyter Notebooks com exemplos de código e soluções prontas em fast.ai documentadas por nós.

Com fast.ai

  1. fast.ai: Convolutional Neural Networks
    1. Parte do 2018 edition of fast.ai’s 7 week course, Practical Deep Learning For Coders
  2. Medium::Transfer-Learning: Classification of 4 different types of Arctic Dogs using Fast.AI Library
    confusion

PyTorch puro

  1. Towards Data Science::Transfer Learning with Convolutional Neural Networks in PyTorch
  2. Medium::Loading and Training a Neural Network with Custom dataset via Transfer Learning in Pytorch

Usando TensorFlow puro

  1. Medium::Making a Custom Object Detector using a Pre-trained Model in Tensorflow
  2. Towards Data Science::Transfer Learning in Tensorflow (VGG19 on CIFAR-10)

Comparações e Discussões de Frameworks

  1. freeCodeCamp::Keras vs PyTorch: how to distinguish Aliens vs Predators with transfer learning

Em outras Disciplinas Mundo Afora

  1. Stanford CS231n: Convolutional Neural Networks for Visual Recognition: Transfer Learning

 

Copyright © 2018 Aldo von Wangenheim/INCoD/Universidade Federal de Santa Catarina

Sobre o Autor

possui graduação em Ciências da Computação pela Universidade Federal de Santa Catarina (1989) e Doutorado Acadêmico (Dr. rer.nat.) em Ciências da Computação pela Universidade de Kaiserslautern (1996). Atualmente é professor Titular da Universidade Federal de Santa Catarina, onde é professor do Programa de Pós-graduação em Ciência da Computação e dos cursos de graduação em Ciências da Computação e Sistemas de Informação. Tem experiência nas áreas de Informática em Saúde, Processamento e Análise de Imagens e Engenharia Biomédica, com ênfase em Telemedicina, Telerradiologia, Sistemas de Auxílio ao Diagnóstico por Imagem e Processamento de Imagens Médicas, com foco nos seguintes temas: analise inteligente de imagens, DICOM, CBIR, informática médica, visão computacional e PACS. Coordena o Instituto Nacional de Ciência e Tecnologia para Convergência Digital - INCoD. Foi o criador e primeiro Coordenador do Núcleo de Telessaúde de Santa Catarina no âmbito do Programa Telessaúde Brasil do Ministério da Saúde e da OPAS - Organização Pan-Americana de Saúde e criador do Núcleo Santa Catarina da RUTE - Rede Universitária de Telemedicina.