1. Visão geral
Neste laboratório, você vai aprender a criar um classificador do Keras. Em vez de tentar descobrir a combinação perfeita de camadas de rede neural para reconhecer flores, vamos usar uma técnica chamada aprendizado por transferência para adaptar um modelo pré-treinado avançado ao nosso conjunto de dados.
Este laboratório inclui as explicações teóricas necessárias sobre redes neurais e é um bom ponto de partida para desenvolvedores que estão aprendendo sobre aprendizado profundo.
Este laboratório é a parte 2 da série "Keras no TPU". Você pode fazer os laboratórios na ordem a seguir ou de forma independente.
- Pipelines de dados com velocidade de TPU: tf.data.Dataset e TFRecords
- [ESTE LABORATÓRIO] Seu primeiro modelo do Keras com aprendizado por transferência
- Redes neurais convolucionais, com Keras e TPUs
- Convnets modernas, squeezenet, Xception, com Keras e TPUs

O que você vai aprender
- A criar seu próprio classificador de imagens do Keras com uma camada softmax e perda de entropia cruzada
- A usar o aprendizado por transferência em vez de criar seus próprios modelos.
Feedback
Se você notar algo errado neste codelab, informe-nos. O feedback pode ser fornecido por meio de problemas do GitHub [link de feedback].
2. Início rápido do Google Colaboratory
Este laboratório usa o Google Colaboratory e não exige configuração da sua parte. O Colaboratory é uma plataforma de notebook on-line para fins educacionais. Ele oferece treinamento sem custo financeiro de CPU, GPU e TPU.

Você pode abrir este notebook de exemplo e executar algumas células para se familiarizar com o Colaboratory.
Selecionar um back-end de TPU

No menu do Colab, selecione Ambiente de execução > Alterar o tipo de ambiente de execução e, em seguida, TPU. Neste codelab, você vai usar uma TPU (Unidade de Processamento de Tensor) avançada com suporte para treinamento acelerado por hardware. A conexão com o ambiente de execução acontece automaticamente na primeira execução, ou você pode usar o botão "Conectar" no canto superior direito.
Execução de notebook

Execute as células uma de cada vez clicando em uma célula e usando Shift + Enter. Você também pode executar o notebook inteiro com Ambiente de execução > Executar tudo
Sumário

Todos os notebooks têm um sumário. Você pode abri-lo usando a seta preta à esquerda.
Células ocultas

Algumas células só mostram o título. Esse é um recurso de notebook específico do Colab. Você pode clicar duas vezes nelas para ver o código dentro, mas geralmente não é muito interessante. Normalmente, funções de suporte ou visualização. Você ainda precisa executar essas células para que as funções internas sejam definidas.
Authentication

É possível que o Colab acesse seus buckets particulares do Google Cloud Storage, desde que você faça a autenticação com uma conta autorizada. O snippet de código acima vai acionar um processo de autenticação.
3. [INFO] Classificador de rede neural 101
Em poucas palavras
Se você já conhece todos os termos em negrito no próximo parágrafo, pode passar para o próximo exercício. Se você está começando no aprendizado profundo, seja bem-vindo e continue lendo.
Para modelos criados como uma sequência de camadas, o Keras oferece a API Sequential. Por exemplo, um classificador de imagens que usa três camadas densas pode ser escrito no Keras como:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )

Rede neural densa
Essa é a rede neural mais simples para classificar imagens. Ela é feita de "neurônios" organizados em camadas. A primeira camada processa dados de entrada e alimenta as saídas em outras camadas. Ela é chamada de "densa" porque cada neurônio está conectado a todos os neurônios da camada anterior.

Você pode alimentar uma imagem em uma rede desse tipo, achatando os valores RGB de todos os pixels em um vetor longo e usando-o como entradas. Não é a melhor técnica para reconhecimento de imagens, mas vamos melhorá-la mais tarde.
Neurônios, ativações, RELU
Um "neurônio" calcula uma soma ponderada de todas as entradas, adiciona um valor chamado "bias" e alimenta o resultado por uma chamada "função de ativação". Os pesos e o bias são desconhecidos no início. Eles serão inicializados aleatoriamente e "aprendidos" treinando a rede neural em muitos dados conhecidos.

A função de ativação mais popular é chamada de RELU para Unidade Linear Retificada. É uma função muito simples, como você pode ver no gráfico acima.
Ativação softmax
A rede acima termina com uma camada de 5 neurônios porque estamos classificando flores em 5 categorias (rosa, tulipa, dente-de-leão, margarida, girassol). Os neurônios em camadas intermediárias são ativados usando a função de ativação RELU clássica. Na última camada, queremos calcular números entre 0 e 1 que representam a probabilidade de essa flor ser uma rosa, uma tulipa e assim por diante. Para isso, vamos usar uma função de ativação chamada "softmax".
A aplicação de softmax em um vetor é feita usando a exponencial de cada elemento e, em seguida, normalizando o vetor, normalmente usando a norma L1 (soma de valores absolutos) para que os valores sejam somados a 1 e possam ser interpretados como probabilidades.

Perda de entropia cruzada
Agora que nossa rede neural produz previsões de imagens de entrada, precisamos medir a qualidade delas, ou seja, a distância entre o que a rede nos informa e as respostas corretas, geralmente chamadas de "rótulos". Lembre-se de que temos rótulos corretos para todas as imagens no conjunto de dados.
Qualquer distância funcionaria, mas para problemas de classificação, a chamada "distância de entropia cruzada" é a mais eficaz. Vamos chamar isso de função de erro ou "perda":

Gradiente descendente
"Treinar" a rede neural significa usar imagens e rótulos de treinamento para ajustar pesos e bias de modo a minimizar a função de perda de entropia cruzada. Veja como funciona.
A entropia cruzada é uma função de pesos, bias, pixels da imagem de treinamento e da classe conhecida.
Se calcularmos as derivadas parciais da entropia cruzada em relação a todos os pesos e todos os bias, vamos obter um "gradiente", calculado para uma determinada imagem, rótulo e valor atual de pesos e bias. Lembre-se de que podemos ter milhões de pesos e bias, então calcular o gradiente parece muito trabalho. Felizmente, o TensorFlow faz isso para nós. A propriedade matemática de um gradiente é que ele aponta "para cima". Como queremos ir para onde a entropia cruzada é baixa, vamos na direção oposta. Atualizamos pesos e bias por uma fração do gradiente. Em seguida, fazemos a mesma coisa repetidas vezes usando os próximos lotes de imagens e rótulos de treinamento, em um loop de treinamento. Esperamos que isso convirja para um lugar em que a entropia cruzada seja mínima, embora nada garanta que esse mínimo seja exclusivo.

Minilote e momentum
Você pode calcular o gradiente em apenas uma imagem de exemplo e atualizar os pesos e bias imediatamente, mas fazer isso em um lote de, por exemplo, 128 imagens fornece um gradiente que representa melhor as restrições impostas por diferentes imagens de exemplo e, portanto, é provável que convirja para a solução mais rapidamente. O tamanho do minilote é um parâmetro ajustável.
Essa técnica, às vezes chamada de "gradiente descendente estocástico", tem outro benefício mais pragmático: trabalhar com lotes também significa trabalhar com matrizes maiores, e elas geralmente são mais fáceis de otimizar em GPUs e TPUs.
No entanto, a convergência ainda pode ser um pouco caótica e até mesmo parar se o vetor de gradiente for todo zero. Isso significa que encontramos um mínimo? Nem sempre. Um componente de gradiente pode ser zero em um mínimo ou máximo. Com um vetor de gradiente com milhões de elementos, se todos forem zeros, a probabilidade de que cada zero corresponda a um mínimo e nenhum deles a um ponto máximo é bem pequena. Em um espaço de muitas dimensões, os pontos de sela são bastante comuns e não queremos parar neles.

Ilustração: um ponto de sela. O gradiente é 0, mas não é um mínimo em todas as direções. (Atribuição de imagem Wikimedia: By Nicoguaro - Own work, CC BY 3.0)
A solução é adicionar algum momentum ao algoritmo de otimização para que ele possa passar pelos pontos de sela sem parar.
Glossário
Lote ou minilote: o treinamento é sempre realizado em lotes de dados e rótulos de treinamento. Isso ajuda o algoritmo a convergir. A dimensão "lote" é normalmente a primeira dimensão dos tensores de dados. Por exemplo, um tensor de forma [100, 192, 192, 3] contém 100 imagens de pixels 192x192 com três valores por pixel (RGB).
Perda de entropia cruzada: uma função de perda especial usada com frequência em classificadores.
Camada densa: uma camada de neurônios em que cada neurônio está conectado a todos os neurônios da camada anterior.
Atributos: as entradas de uma rede neural às vezes são chamadas de "atributos". A arte de descobrir quais partes de um conjunto de dados (ou combinações de partes) alimentar em uma rede neural para obter boas previsões é chamada de "engenharia de atributos".
Rótulos: outro nome para "classes" ou respostas corretas em um problema de classificação supervisionada
Taxa de aprendizado: fração do gradiente pelo qual pesos e bias são atualizados em cada iteração do loop de treinamento.
Logits: as saídas de uma camada de neurônios antes da aplicação da função de ativação são chamadas de "logits". O termo vem da "função logística", também conhecida como "função sigmoide", que costumava ser a função de ativação mais popular. "Saídas de neurônios antes da função logística" foi abreviado para "logits".
Perda: a função de erro que compara as saídas da rede neural com as respostas corretas
Neurônio: calcula a soma ponderada das entradas, adiciona um bias e alimenta o resultado por uma função de ativação.
Codificação one-hot: a classe 3 de 5 é codificada como um vetor de 5 elementos, todos zeros, exceto o terceiro, que é 1.
relu: unidade linear retificada. Uma função de ativação popular para neurônios.
sigmoid: outra função de ativação que costumava ser popular e ainda é útil em casos especiais.
softmax: uma função de ativação especial que atua em um vetor, aumenta a diferença entre o maior componente e todos os outros e também normaliza o vetor para ter uma soma de 1, de modo que ele possa ser interpretado como um vetor de probabilidades. Usado como a última etapa em classificadores.
Tensor: um "tensor" é como uma matriz, mas com um número arbitrário de dimensões. Um tensor unidimensional é um vetor. Um tensor bidimensional é uma matriz. E você pode ter tensores com 3, 4, 5 ou mais dimensões.
4. Aprendizado por transferência
Para um problema de classificação de imagens, as camadas densas provavelmente não serão suficientes. Precisamos aprender sobre camadas convolucionais e as muitas maneiras de organizá-las.
Mas também podemos pegar um atalho. Há redes neurais convolucionais totalmente treinadas disponíveis para download. É possível cortar a última camada, o cabeçalho de classificação softmax, e substituí-la pela sua. Todos os pesos e bias treinados permanecem como estão, você só retreina a camada softmax que adiciona. Essa técnica é chamada de aprendizado por transferência e, surpreendentemente, funciona desde que o conjunto de dados em que a rede neural é pré-treinada seja "suficientemente próximo" do seu.
Prática
Abra o notebook a seguir, execute as células (Shift + Enter) e siga as instruções sempre que vir um rótulo "TRABALHO NECESSÁRIO".
Keras Flowers transfer learning (playground).ipynb
Informações adicionais
Com o aprendizado por transferência, você se beneficia de arquiteturas avançadas de redes neurais convolucionais desenvolvidas por pesquisadores de ponta e de pré-treinamento em um enorme conjunto de dados de imagens. No nosso caso, vamos usar aprendizado por transferência de uma rede treinada no ImageNet, um banco de dados de imagens que contém muitas plantas e cenas ao ar livre, que é suficientemente próximo de flores.

Ilustração: usar uma rede neural convolucional complexa, já treinada, como uma caixa preta, retreinando apenas o cabeçalho de classificação. Esse é o aprendizado por transferência. Vamos ver como esses arranjos complicados de camadas convolucionais funcionam mais tarde. Por enquanto, esse é o problema de outra pessoa.
Aprendizado por transferência no Keras
No Keras, é possível instanciar um modelo pré-treinado da coleção tf.keras.applications.*. O MobileNet V2, por exemplo, é uma arquitetura convolucional muito boa que permanece de tamanho razoável. Ao selecionar include_top=False, você recebe o modelo pré-treinado sem a camada softmax final para que possa adicionar a sua:
pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False
model = tf.keras.Sequential([
pretrained_model,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(5, activation='softmax')
])
Observe também a configuração pretrained_model.trainable = False. Ela congela os pesos e bias do modelo pré-treinado para que você treine apenas a camada softmax. Isso normalmente envolve relativamente poucos pesos e pode ser feito rapidamente e sem exigir um conjunto de dados muito grande. No entanto, se você tiver muitos dados, o aprendizado por transferência poderá funcionar ainda melhor com pretrained_model.trainable = True. Os pesos pré-treinados fornecem excelentes valores iniciais e ainda podem ser ajustados pelo treinamento para se adequar melhor ao problema.
Por fim, observe a camada Flatten() inserida antes da camada softmax densa. As camadas densas funcionam em vetores de dados simples, mas não sabemos se é isso que o modelo pré-treinado retorna. É por isso que precisamos achatar. No próximo capítulo, à medida que nos aprofundamos nas arquiteturas convolucionais, vamos explicar o formato de dados retornado pelas camadas convolucionais.
Você vai chegar perto de 75% de acurácia com essa abordagem.
Solução
Este é o notebook de solução. Você pode usá-lo se estiver preso.
Keras Flowers transfer learning (solution).ipynb
O que vimos
- 🤔 Como escrever um classificador no Keras
- 🤓 configurado com uma última camada softmax e perda de entropia cruzada
- 😈 Aprendizado por transferência
- 🤔 Treinar seu primeiro modelo
- 🧐 Acompanhar a perda e a acurácia durante o treinamento
Reserve um momento para analisar esta lista de verificação.
5. Parabéns!
Agora você pode criar um modelo do Keras. Continue para o próximo laboratório para aprender a montar camadas convolucionais.
- Pipelines de dados com velocidade de TPU: tf.data.Dataset e TFRecords
- [ESTE LABORATÓRIO] Seu primeiro modelo do Keras com aprendizado por transferência
- Redes neurais convolucionais, com Keras e TPUs
- Convnets modernas, squeezenet, Xception, com Keras e TPUs
TPUs na prática
TPUs e GPUs estão disponíveis no AI Platform do Google Cloud:
- Em VMs de aprendizado profundo
- Nos notebooks do AI Platform
- Nos jobs de treinamento do AI Platform
Por fim, adoramos receber feedback. Informe-nos se você notar algo errado neste laboratório ou se achar que ele precisa ser melhorado. O feedback pode ser fornecido por meio de problemas do GitHub [link de feedback].

|

