Path: blob/master/site/pt-br/tutorials/generative/dcgan.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Rede Adversária Generativa Convolucional Profunda
Este tutorial demonstra como gerar imagens de dígitos escritos à mão usando uma Rede Adversária Generativa Convolucional Profunda (DCGAN, na sigla em inglês). O código é escrito usando a API Sequential do Keras, com um loop de treinamento tf.GradientTape
.
O que são GANs?
As Redes Adversárias Generativas (GANs, na sigla em inglês) são uma das ideias mais interessantes da ciência da computação da atualidade. Dois modelos são treinados simultaneamente por um processo adversário. Um gerador (“o artista”) aprende a criar imagens que parecem reais, enquanto um discriminador (“o crítico de arte”) aprende a diferenciar imagens reais de falsas.
Durante o treinamento, o gerador fica cada vez melhor em criar imagens que parecem reais, enquanto o discriminador fica cada vez melhor em identificá-las. O processo alcança o equilíbrio quando o discriminador não consegue mais distinguir imagens reais de falsas.
Este notebook demonstra esse processo no dataset MNIST. O GIF animado abaixo mostra uma série de imagens produzidas pelo gerador após ser treinado com 50 épocas. As imagens começam como um ruído aleatório e se parecem cada vez mais com dígitos escritos à mão ao longo do tempo.
Para saber mais sobre GANs, confira o curso Introdução ao aprendizado profundo do MIT.
Configuração
Carregar e preparar o dataset
Você usará o dataset MNIST para treinar o gerador e o discriminador. O gerador vai gerar dígitos escritos à mão que parecem os dados do MNIST.
Criar os modelos
Tanto o gerador quanto o discriminador são definidos usando a API Sequential do Keras.
O gerador
O gerador usa camadas do tf.keras.layers.Conv2DTranspose
(upsampling) para produzir uma imagem a partir de uma semente (ruído aleatório). Comece com uma camada Dense
que recebe essa semente como entrada, depois faça o upsampling diversas vezes até conseguir o tamanho de imagem desejado de 28x28x1. Observe a ativação do tf.keras.layers.LeakyReLU
para cada camada, exceto pela camada de saída, que usa tanh.
Use o gerador (ainda não treinado) para criar uma imagem.
O discriminador
O discriminador é um classificador de imagens baseado em uma CNN.
Use o discriminador (ainda não treinado) para classificar as imagens geradas como reais ou falsas. O modelo será treinado para gerar como saída valores positivos para imagens reais e valores negativos para imagens falsas.
Definir a perda e os otimizadores
Defina funções de perda e otimizadores para os dois modelos.
Perda do discriminador
Este método quantifica em que nível o discriminador consegue distinguir imagens reais de falsas. Ele compara as previsões de imagens reais do discriminador com um array de 1s e as previsões de imagens falsas (geradas) do discriminador com um array de 0s.
Perda do gerador
A perda do gerador quantifica em que nível ele consegue enganar o discriminador. Intuitivamente, se o gerador estiver com bom desempenho, o discriminador classificará as imagens falsas como reais (ou 1). Agora, compare as decisões do discriminador sobre as imagens geradas com um array de 1s.
Os otimizadores do discriminador e do gerador são diferentes, já que você treinará duas redes separadamente.
Salvar checkpoints
Este notebook também demonstra como salvar e restaurar modelos, o que pode ser útil caso uma tarefa de treinamento demorada seja interrompida.
Definir o loop de treinamento
O loop de treinamento começa com o gerador recebendo uma semente aleatória como entrada. Essa semente é usada para gerar uma imagem. Em seguida, o discriminador é usado para classificar imagens reais (obtidas no conjunto de treinamento) e imagens falsas (geradas pelo gerador). A perda é calculada para cada modelo, e os gradientes são usados para atualizar o gerador e o discriminador.
Gerar e salvar imagens
Treinar o modelo
Faça uma chamada ao método train()
definido acima para treinar o gerador e o discriminador simultaneamente. Treinar GANs pode ser complicado. É importante que o gerador e o discriminador não sobrecarreguem um ao outro (por exemplo, não devem fazer o treinamento a uma taxa similar).
No começo do treinamento, as imagens geradas parecem ruído aleatório. À medida que o treinamento progride, os dígitos gerados parecerão cada vez mais reais. Após cerca de 50 épocas, eles parecem dígitos do MNIST. Isso pode levar um minuto por época com as configurações padrão do Colab.
Restaure o último checkpoint.
Criar um GIF
Use o imageio
para criar um GIF animado usando as imagens salvas durante o treinamento.
Próximos passos
Este tutorial demonstrou o código necessário para escrever e treinar uma GAN. Agora, talvez você queira experimentar um dataset diferente, por exemplo, o dataset Atributos de rostos de celebridades em grande escala (CelebA), disponível no Kaggle. Para saber mais sobre GANs, confira o Tutorial do NIPS 2016: Redes Adversárias Generativas.