Como reaproveitar redes pré-treinadas para novas tarefas?
Contents
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
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.
- The Keras Blog: Building powerful image classification models using very little data
- Satya Mallick: Keras Tutorial : Transfer Learning using pre-trained models
- TensorFlow: How to Retrain an Image Classifier for New Categories
- 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?
- 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…
- The Keras Blog: Building powerful image classification models using very little data
- Satya Mallick: Keras Tutorial : Fine-tuning using pre-trained models
- Medium: Transfer Learning using Keras (na verdade este é um tutorial de ajuste fino…)
- 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)
- Towards Data Science::Keras Transfer Learning For Beginners
- Towards Data Science::Transfer learning from pre-trained models
- engMRK::Keras Application for Pre-trained Model
- TensorFlow: Fine-Tuning
- Medium::Transfer Leaning – How a Pre-Trained CNN could be used as a Feature Extractor
- A Comprehensive guide to Fine-tuning Deep Learning Models in Keras
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
- fast.ai: Convolutional Neural Networks
- Medium::Transfer-Learning: Classification of 4 different types of Arctic Dogs using Fast.AI Library
PyTorch puro
- Towards Data Science::Transfer Learning with Convolutional Neural Networks in PyTorch
- Medium::Loading and Training a Neural Network with Custom dataset via Transfer Learning in Pytorch
Usando TensorFlow puro
- Medium::Making a Custom Object Detector using a Pre-trained Model in Tensorflow
- Towards Data Science::Transfer Learning in Tensorflow (VGG19 on CIFAR-10)
Comparações e Discussões de Frameworks
Em outras Disciplinas Mundo Afora
- Stanford CS231n: Convolutional Neural Networks for Visual Recognition: Transfer Learning
Copyright © 2018 Aldo von Wangenheim/INCoD/Universidade Federal de Santa Catarina