Autoencoder no TensorFlow com exemplo

โšก Resumo Inteligente

Os autoencoders comprimem uma entrada em uma representaรงรฃo interna menor e, em seguida, a reconstroem, aprendendo as caracterรญsticas mais importantes sem rรณtulos. Este tutorial empilha quatro camadas densas no TensorFlow e reconstrรณi imagens de cavalos do CIFAR-10.

  • ๐Ÿ”˜ Codificador e decodificador: Dois blocos simรฉtricos se encontram em uma camada de codificaรงรฃo estreita que forรงa a rede a manter apenas o sinal essencial.
  • โ˜‘๏ธ Preparaรงรฃo do conjunto de dados: Os lotes do CIFAR-10 sรฃo carregados, convertidos para escala de cinza, empilhados e filtrados atรฉ se obterem as 5,000 imagens de cavalos.
  • โœ… Tubulaรงรฃo de alimentaรงรฃo: Um estimador de conjunto de dados com `from_tensor_slices`, `repeat` e `batch` fornece imagens atravรฉs de um iterador inicializรกvel.
  • ๐Ÿงช Formato da rede: As larguras das camadas sรฃo 1024, 300, 150, 300 e 1024, com ativaรงรฃo ELU, inicializaรงรฃo Xavier e regularizaรงรฃo L2.
  • ๐Ÿ› ๏ธ Configuraรงรฃo do treinamento: Erro quadrรกtico mรฉdio entre a saรญda e a entrada, otimizador Adam, tamanho do lote de 150 e 33 iteraรงรตes por รฉpoca.
  • ๐Ÿ“‰ Resultado medido: Ao longo de 100 รฉpocas, a perda de treinamento cai de 2,934 para aproximadamente 1,454 antes que a reconstruรงรฃo seja plotada.

Autoencoder no TensorFlow

O que รฉ Autoencoder em Deep Learning?

An Codificador automรกtico รฉ uma ferramenta para aprender codificaรงรฃo de dados de forma eficiente em um nรฃo supervisionado maneira. ร‰ um tipo de rede neural artificial Isso ajuda a aprender a representaรงรฃo de conjuntos de dados para reduรงรฃo de dimensionalidade, treinando a rede neural para ignorar o ruรญdo do sinal. ร‰ uma รณtima ferramenta para recriar uma entrada.

Em termos simples, a mรกquina recebe, digamos, uma imagem e consegue produzir uma imagem muito semelhante. A entrada nesse tipo de rede neural nรฃo รฉ rotulada, o que significa que a rede รฉ capaz de aprender sem supervisรฃo. Mais precisamente, a entrada รฉ codificada pela rede para focar apenas nas caracterรญsticas mais importantes. Essa รฉ uma das razรตes pelas quais o autoencoder รฉ popular para reduรงรฃo de dimensionalidade. Alรฉm disso, os autoencoders podem ser usados โ€‹โ€‹para produzir modelos de aprendizado generativo. Por exemplo, a rede neural pode ser treinada com um conjunto de rostos e, em seguida, gerar novos rostos.

Como funciona o codificador automรกtico do TensorFlow?

O objetivo de um autoencoder รฉ produzir uma aproximaรงรฃo da entrada concentrando-se apenas nos recursos essenciais. Vocรช pode pensar por que nรฃo simplesmente aprender como copiar e colar a entrada para produzir a saรญda. Na verdade, um autoencoder รฉ um conjunto de restriรงรตes que forรงa a rede a aprender novas maneiras de representar os dados, diferente de apenas copiar a saรญda.

Um autoencoder tรญpico รฉ definido com uma entrada, uma representaรงรฃo interna e uma saรญda (uma aproximaรงรฃo da entrada). O aprendizado ocorre nas camadas associadas ร  representaรงรฃo interna. De fato, existem dois blocos principais de camadas que se assemelham a uma rede neural tradicional. A pequena diferenรงa รฉ que a camada que contรฉm a saรญda deve ser igual ร  entrada. No diagrama abaixo, a entrada original entra no primeiro bloco, chamado de codificador. Essa representaรงรฃo interna comprime (reduz) o tamanho da entrada. No segundo bloco ocorre a reconstruรงรฃo da entrada. Essa รฉ a fase de decodificaรงรฃo.

Blocos de codificador e decodificador de um autoencoder com a representaรงรฃo interna comprimida no meio.
Funcionamento do Autoencoder

O modelo atualizarรก os pesos minimizando a funรงรฃo de perda. O modelo รฉ penalizado se a saรญda da reconstruรงรฃo for diferente da entrada.

Concretamente, imagine uma imagem de 50ร—50 (ou seja, 2,500 pixels) e uma rede neural com apenas uma camada oculta composta por cem neurรดnios. O aprendizado รฉ feito em um mapa de caracterรญsticas 25 vezes menor que a entrada. Isso significa que a rede precisa encontrar uma maneira de reconstruir 2,500 pixels com um vetor de neurรดnios igual a apenas 100.

Exemplo de codificador automรกtico empilhado

Neste tutorial sobre autoencoders, vocรช aprenderรก como usar um autoencoder empilhado. A arquitetura รฉ semelhante ร  de uma rede neural tradicional. A entrada passa por uma camada oculta para ser comprimida, ou seja, ter seu tamanho reduzido, e entรฃo chega ร s camadas de reconstruรงรฃo. O objetivo รฉ produzir uma imagem de saรญda o mais prรณxima possรญvel da original. O modelo precisa aprender uma maneira de realizar sua tarefa dentro de um conjunto de restriรงรตes, isto รฉ, com uma dimensรฃo menor.

Atualmente, os autoencoders em aprendizado profundo sรฃo usados โ€‹โ€‹principalmente para remover ruรญdo de uma imagem. Imagine uma imagem com arranhรตes; um ser humano ainda consegue reconhecer o conteรบdo. A ideia do autoencoder de remoรงรฃo de ruรญdo รฉ adicionar ruรญdo ร  imagem para forรงar a rede a aprender o padrรฃo por trรกs dos dados.

Outra famรญlia รบtil de Autoencoders Deep Learning รฉ um autoencoder variacional. Esse tipo de rede pode gerar novas imagens. Imagine que vocรช treine uma rede com a imagem de um homem; essa rede pode produzir novos rostos.

A tabela abaixo coloca o autoencoder empilhado construรญdo neste tutorial ao lado de outras famรญlias que vocรช provavelmente encontrarรก, para que a restriรงรฃo que cada um adiciona seja fรกcil de comparar.

Tipo de autoencoder Restriรงรฃo adicionada Uso tรญpico
Incompleto/empilhado Camada de codificaรงรฃo mais estreita que a entrada Reduรงรฃo de dimensionalidade, recurso extracรงรฃo
Eliminar ruรญdo Ruรญdo adicionado ร  entrada, alvo limpo Limpeza de imagem e sinal
Escasso Penalidade sobre o nรบmero de unidades ativas Caracterรญsticas interpretรกveis โ€‹โ€‹baseadas em partes
Variacional A camada de codificaรงรฃo aprende uma distribuiรงรฃo de probabilidade. Gerando novas amostras

Como construir um autoencoder com TensorFlow

Neste tutorial, vocรช aprenderรก como construir um autoencoder empilhado para reconstruir uma imagem.

Vocรช utilizarรก o conjunto de dados CIFAR-10, que contรฉm 60000 imagens coloridas de 32ร—32 pixels. O conjunto de dados do Autoencoder jรก estรก dividido em 50000 imagens para treinamento e 10000 para teste. Hรก atรฉ dez classes:

  • Aviรฃo
  • Automobile
  • Pรกssaro
  • Gato
  • Veado
  • Cachorro
  • Sapo
  • Horse
  • Navio
  • Truck

Vocรช precisa baixar as imagens do Pรกgina do conjunto de dados CIFAR-10 e descompacte o arquivo. A pasta cifar-10-batches-py contรฉm cinco lotes de dados com 10000 imagens cada, em ordem aleatรณria.

Antes de construir e treinar seu modelo, vocรช precisa aplicar algum processamento de dados. Vocรช procederรก da seguinte forma:

  1. Importar os dados
  2. Converta os dados para o formato preto e branco
  3. Anexar todos os lotes
  4. Construa o conjunto de dados de treinamento
  5. Construa um visualizador de imagens

Nota de versรฃo: O cรณdigo neste tutorial รฉ direcionado ao TensorFlow 1.x. No TensorFlow 2, o mรณdulo tf.contrib nรฃo existe mais, e os placeholders, sessรตes e o iterador inicializรกvel residem em tf.compat.v1. Chamar tf.compat.v1.disable_v2_behavior() apรณs a importaรงรฃo รฉ a maneira mais rรกpida de executar os exemplos sem alteraรงรตes.

Prรฉ-processamento de imagem

Etapa 1) Importe os dados

De acordo com o site oficial, vocรช pode carregar os dados com o seguinte cรณdigo. O cรณdigo do Autoencoder carregarรก os dados em um dicionรกrio contendo os dados e os rรณtulos. Observe que o cรณdigo รฉ uma funรงรฃo.

import numpy as np
import tensorflow as tf
import pickle
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='latin1')
    return dict

Etapa 2) Converta os dados para o formato preto e branco

Para simplificar, vocรช converterรก os dados em escala de cinza. Ou seja, com apenas uma dimensรฃo contra trรชs para imagem em cores. A maior parte da rede neural funciona apenas com entrada de uma dimensรฃo.

def grayscale(im):
    return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)

Etapa 3) Anexe todos os lotes

Agora que ambas as funรงรตes foram criadas e o conjunto de dados carregado, vocรช pode escrever um loop para adicionar os dados ร  memรณria. Se vocรช observar com atenรงรฃo, o arquivo descompactado com os dados se chama `data_batch_` e contรฉm um nรบmero de 1 a 5. Vocรช pode percorrer os arquivos e adicionรก-los ร  variรกvel `data`.

Ao concluir esta etapa, vocรช converte os dados de cor para um formato de escala de cinza. Como vocรช pode ver, o formato dos dados รฉ 50000 e 1024. Os pixels de 32x32 agora estรฃo achatados em 1024.

# Load the data into memory
data, labels = [], []
## Loop over the b
for i in range(1, 6):
    filename = './cifar-10-batches-py/data_batch_' + str(i)
    open_data = unpickle(filename)
    if len(data) > 0:
        data = np.vstack((data, open_data['data']))
        labels = np.hstack((labels, open_data['labels']))
    else:
        data = open_data['data']
        labels = open_data['labels']

data = grayscale(data)
x = np.matrix(data)
y = np.array(labels)
print(x.shape)
(50000, 1024)

Observaรงรฃo: Altere './cifar-10-batches-py/data_batch_' para o local real do seu arquivo. Por exemplo, para um Windows mรกquina, o caminho pode ser filename = 'E:\cifar-10-batches-py\data_batch_' + str(i)

Etapa 4) Construa o conjunto de dados de treinamento

Para tornar o treinamento mais rรกpido e fรกcil, vocรช treinarรก um modelo apenas com as imagens de cavalos. Os cavalos possuem o rรณtulo 7 nos dados de rรณtulo. Conforme mencionado na documentaรงรฃo do conjunto de dados CIFAR-10, cada classe contรฉm 5000 imagens. Vocรช pode imprimir o formato dos dados para confirmar que existem 5,000 imagens com 1024 colunas, como mostrado no exemplo de Autoencoder do TensorFlow abaixo.

horse_i = np.where(y == 7)[0]
horse_x = x[horse_i]
print(np.shape(horse_x)) 
(5000, 1024)

Etapa 5) Construa um visualizador de imagens

Finalmente, vocรช constrรณi uma funรงรฃo para plotar as imagens. Vocรช precisarรก desta funรงรฃo para imprimir a imagem reconstruรญda do autoencoder.

Uma maneira fรกcil de imprimir imagens รฉ usar a funรงรฃo imshow() da biblioteca Matplotlib. Observe que vocรช precisa converter o formato dos dados de 1024 para 32x32 (ou seja, o formato de uma imagem).

# To plot pretty figures
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
def plot_image(image, shape=[32, 32], cmap = "Greys_r"):
    plt.imshow(image.reshape(shape), cmap=cmap,interpolation="nearest")
    plt.axis("off")   

A funรงรฃo leva 3 argumentos:

  • Imagem: a entrada
  • Forma: lista, dimensรฃo da imagem
  • Cmap: escolha o mapa de cores. Por padrรฃo, cinza.

Vocรช pode tentar plotar a primeira imagem no conjunto de dados. Vocรช deveria ver um homem a cavalo.

plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")

A chamada retorna a miniatura em tons de cinza abaixo e confirma que a remodelaรงรฃo de 1024 valores para uma imagem de 32ร—32 estรก correta.

Miniatura em tons de cinza 32x32 CIFAR-10 de um cavaleiro a cavalo, plotada com plot_image().

Definir estimador de conjunto de dados

Muito bem, agora que o conjunto de dados estรก pronto para uso, vocรช pode comeรงar a usar o TensorFlow. Antes de construir o modelo, use o estimador de conjunto de dados do TensorFlow para alimentar a rede.

Vocรช construirรก um conjunto de dados com estimador TensorFlow. Para refrescar sua mente, vocรช precisa usar:

  • from_tensor_slices
  • repetir
  • fornada

O cรณdigo completo para construir o conjunto de dados รฉ:

dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)

Observe que x รฉ um marcador de posiรงรฃo com formato [None, n_inputs]. A primeira dimensรฃo รฉ definida como None porque o nรบmero de imagens enviadas ร  rede รฉ igual ao tamanho do lote, que รฉ definido apenas em tempo de execuรงรฃo. Para mais detalhes, consulte o tutorial sobre Regressรฃo linear com TensorFlow.

Depois disso, vocรช precisa criar o iterador. Sem esta linha de cรณdigo, nenhum dado passarรก pelo pipeline.

iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()

Agora que o pipeline estรก pronto, vocรช pode verificar se a primeira imagem รฉ a mesma de antes (ou seja, um homem a cavalo).

Vocรช definiu o tamanho do lote como 1 porque deseja alimentar o conjunto de dados com apenas uma imagem. Vocรช pode ver a dimensรฃo dos dados com `print(sess.run(features).shape)`. Ela รฉ igual a (1, 1024). O valor 1 significa que uma รบnica imagem com 1024 valores รฉ processada a cada vez. Se o tamanho do lote for definido como 2, duas imagens passarรฃo pelo pipeline. Nรฃo altere o tamanho do lote, caso contrรกrio, ocorrerรก um erro, pois apenas uma imagem por vez pode ser processada pela funรงรฃo `plot_image()`.

## Parameters
n_inputs = 32 * 32
BATCH_SIZE = 1
batch_size = tf.placeholder(tf.int64)

# using a placeholder
x = tf.placeholder(tf.float32, shape=[None,n_inputs])
## Dataset
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
iter = dataset.make_initializable_iterator() # create the iterator
features = iter.get_next()

## Print the image
with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iter.initializer, feed_dict={x: horse_x,
                                         batch_size: BATCH_SIZE}) 
    print(sess.run(features).shape) 
    plot_image(sess.run(features), shape=[32, 32], cmap = "Greys_r")
(1, 1024)

O pipeline retorna o mesmo ciclista que foi plotado diretamente da matriz NumPy, o que comprova que o marcador de posiรงรฃo, o iterador e o tamanho do lote estรฃo configurados corretamente.

A mesma miniatura do cavalo impressa apรณs a imagem passar pelo iterador do conjunto de dados do TensorFlow.

Construa a rede

ร‰ hora de construir a rede. Vocรช treinarรก um autoencoder empilhado, ou seja, uma rede com mรบltiplas camadas ocultas.

Sua rede terรก uma camada de entrada com 1024 pontos, ou seja, 32ร—32, o formato da imagem.

O bloco codificador terรก uma camada oculta superior com 300 neurรดnios e uma camada central com 150 neurรดnios. O bloco decodificador รฉ simรฉtrico ao codificador. Vocรช pode visualizar a rede no diagrama abaixo. Observe que vocรช pode alterar os valores das camadas oculta e central.

Arquitetura de autoencoder simรฉtrico com 1024 entradas, camadas de codificaรงรฃo de 300 e 150 unidades e um decodificador espelhado.

Construindo a rede para Autoencoder

Construir um autoencoder รฉ muito semelhante a qualquer outro modelo de aprendizado profundo.

Vocรช construirรก o modelo seguindo estas etapas:

  1. Defina os parรขmetros
  2. Defina as camadas
  3. Defina a arquitetura
  4. Defina a otimizaรงรฃo
  5. Execute o modelo
  6. Avalie o modelo

Na seรงรฃo anterior, vocรช aprendeu como criar um pipeline para alimentar o modelo, portanto, nรฃo รฉ necessรกrio criar o conjunto de dados novamente. Vocรช construirรก um autoencoder com quatro camadas. Vocรช usarรก a inicializaรงรฃo de Xavier. Esta รฉ uma tรฉcnica para definir os pesos iniciais de acordo com a variรขncia da entrada e da saรญda. Finalmente, vocรช usarรก a funรงรฃo de ativaรงรฃo ELU. Vocรช regularizarรก a funรงรฃo de perda com um regularizador L2.

Etapa 1) Defina os parรขmetros

O primeiro passo implica definir o nรบmero de neurรดnios em cada camada, a taxa de aprendizagem e o hiperparรขmetro do regularizador.

Antes disso, vocรช importa a funรงรฃo parcial. ร‰ um mรฉtodo melhor para definir os parรขmetros das camadas densas. O cรณdigo abaixo define os valores da arquitetura do autoencoder. Como mencionado anteriormente, o encoder possui duas camadas, com 300 neurรดnios na primeira camada e 150 na segunda. Seus valores sรฃo armazenados em n_hidden_1 e n_hidden_2.

Vocรช precisa definir a taxa de aprendizado e o hiperparรขmetro L2. Os valores sรฃo armazenados em `learning_rate` e `l2_reg`.

from functools import partial

## Encoder
n_hidden_1 = 300
n_hidden_2 = 150  # codings

## Decoder
n_hidden_3 = n_hidden_1
n_outputs = n_inputs

learning_rate = 0.01
l2_reg = 0.0001

A tรฉcnica de inicializaรงรฃo de Xavier รฉ chamada com o objeto `xavier_initializer` do estimador `contrib`. No mesmo estimador, vocรช pode adicionar o regularizador com `l2_regularizer`.

## Define the Xavier initialization
xav_init =  tf.contrib.layers.xavier_initializer()
## Define the L2 regularizer
l2_regularizer = tf.contrib.layers.l2_regularizer(l2_reg)

Nota de versรฃo: O tf.contrib foi removido no TensorFlow 2. Os substitutos diretos sรฃo tf.keras.initializers.GlorotUniform() para xavier_initializer() e tf.keras.regularizers.l2() para l2_regularizer().

Etapa 2) Defina as camadas

Todos os parรขmetros das camadas densas foram definidos; vocรช pode agrupar tudo na variรกvel `dense_layer` usando o objeto `partial`. A funรงรฃo `dense_layer` utiliza a ativaรงรฃo ELU, a inicializaรงรฃo de Xavier e a regularizaรงรฃo L2 em cada chamada.

## Create the dense layer
dense_layer = partial(tf.layers.dense,
                         activation=tf.nn.elu,
                         kernel_initializer=xav_init,
                         kernel_regularizer=l2_regularizer)

Etapa 3) Defina a arquitetura

Se vocรช observar o diagrama da arquitetura, notarรก que a rede empilha trรชs camadas com uma camada de saรญda. No cรณdigo abaixo, vocรช conecta as camadas apropriadas. Por exemplo, a primeira camada calcula o produto escalar entre a matriz de caracterรญsticas de entrada e a matriz contendo os 300 pesos. Apรณs o cรกlculo do produto escalar, a saรญda รฉ enviada para a funรงรฃo de ativaรงรฃo ELU. A saรญda se torna a entrada da prรณxima camada, por isso vocรช a utiliza para calcular hidden_2 e assim por diante. A multiplicaรงรฃo de matrizes รฉ a mesma para cada camada, pois vocรช usa a mesma funรงรฃo de ativaรงรฃo. Observe que a รบltima camada, outputs, nรฃo aplica uma funรงรฃo de ativaรงรฃo. Isso faz sentido, pois essa รฉ a entrada reconstruรญda.

## Make the mat mul
hidden_1 = dense_layer(features, n_hidden_1)
hidden_2 = dense_layer(hidden_1, n_hidden_2)
hidden_3 = dense_layer(hidden_2, n_hidden_3)
outputs = dense_layer(hidden_3, n_outputs, activation=None)

Etapa 4) Defina a otimizaรงรฃo

O รบltimo passo รฉ construir o otimizador. Vocรช usa o Erro Quadrรกtico Mรฉdio (MSE) como funรงรฃo de perda. Se vocรช se lembra do tutorial sobre regressรฃo linear, sabe que o MSE รฉ calculado pela diferenรงa entre a saรญda prevista e o rรณtulo real. Aqui, o rรณtulo รฉ a caracterรญstica, pois o modelo tenta reconstruir a entrada. Portanto, vocรช quer a mรฉdia da soma dos quadrados das diferenรงas entre a saรญda prevista e a entrada. Com o TensorFlow, vocรช pode codificar a funรงรฃo de perda da seguinte forma:

loss = tf.reduce_mean(tf.square(outputs - features))

Em seguida, vocรช precisa otimizar a funรงรฃo de perda. Vocรช usa o otimizador Adam para calcular os gradientes. A funรงรฃo objetivo รฉ minimizar a perda.

## Optimize
loss = tf.reduce_mean(tf.square(outputs - features))
optimizer = tf.train.AdamOptimizer(learning_rate)
train  = optimizer.minimize(loss)

Mais uma configuraรงรฃo antes de treinar o modelo. Vocรช deseja usar um tamanho de lote de 150, ou seja, alimentar o pipeline com 150 imagens a cada iteraรงรฃo. Vocรช precisa calcular o nรบmero de iteraรงรตes manualmente. Isso รฉ trivial de fazer:

Se vocรช quiser processar 150 imagens por vez e souber que existem 5000 imagens no conjunto de dados, o nรบmero de iteraรงรตes serรก igual a 5000 dividido por 150. Python Vocรช pode executar os seguintes cรณdigos e verificar se a saรญda รฉ 33:

BATCH_SIZE = 150
### Number of batches :  length dataset / batch size
n_batches = horse_x.shape[0] // BATCH_SIZE
print(n_batches)
33

Etapa 5) Execute o modelo

Por รบltimo, mas nรฃo menos importante, treine o modelo. Vocรช estรก treinando o modelo com 100 รฉpocas. Ou seja, o modelo verรก as imagens 100 vezes enquanto otimiza os pesos.

Vocรช jรก estรก familiarizado com os cรณdigos para treinar um modelo no TensorFlow. A pequena diferenรงa รฉ que os dados sรฃo enviados antes de executar o treinamento. Dessa forma, o modelo รฉ treinado mais rapidamente.

Vocรช estรก interessado em imprimir a perda apรณs dez รฉpocas para ver se o modelo estรก aprendendo alguma coisa (ou seja, a perda estรก diminuindo). O treinamento leva de 2 a 5 minutos, dependendo do hardware da sua mรกquina.

## Set params
n_epochs = 100

## Call Saver to save the model and re-use it later during evaluation
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # initialise iterator with train data
    sess.run(iter.initializer, feed_dict={x: horse_x,
                                          batch_size: BATCH_SIZE})
    print('Training...')
    print(sess.run(features).shape) 
    for epoch in range(n_epochs):       
        for iteration in range(n_batches):
            sess.run(train)
        if epoch % 10 == 0:
            loss_train = loss.eval()   # not shown
            print("\r{}".format(epoch), "Train MSE:", loss_train) 
        #saver.save(sess, "./my_model_all_layers.ckpt") 
    save_path = saver.save(sess, "./model.ckpt")    
    print("Model saved in path: %s" % save_path)  
Training...
(150, 1024)
0 Train MSE: 2934.455
10 Train MSE: 1672.676
20 Train MSE: 1514.709
30 Train MSE: 1404.3118
40 Train MSE: 1425.058
50 Train MSE: 1479.0631
60 Train MSE: 1609.5259
70 Train MSE: 1482.3223
80 Train MSE: 1445.7035
90 Train MSE: 1453.8597
Model saved in path: ./model.ckpt

Etapa 6) Avalie o modelo

Agora que vocรช treinou seu modelo, รฉ hora de avaliรก-lo. Vocรช precisa importar o conjunto de teste do arquivo /cifar-10-batches-py/.

test_data = unpickle('./cifar-10-batches-py/test_batch')
test_x = grayscale(test_data['data'])
#test_labels = np.array(test_data['labels'])

Observaรงรฃo: Para uma soluรงรฃo mais permanente, um ferrolho ou uma tranca de sobrepor pode ser fixado ร  porta e ao batente com parafusos. Quando acionado, o ferrolho desliza para um suporte receptor na parede ou no batente, mantendo a porta de embutir firmemente fechada. Esta รฉ uma das opรงรตes sem fechadura mais seguras disponรญveis e pode ser instalada em menos de XNUMX minutos com ferramentas bรกsicas. Windows mรกquina, o cรณdigo se torna test_data = unpickle(rโ€E:\cifar-10-batches-py\test_batchโ€)

Vocรช pode tentar imprimir a imagem 13, que รฉ um cavalo.

plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")

O grรกfico confirma que o lote de teste foi carregado corretamente e que a imagem 13 pertence ร  classe na qual o modelo foi treinado.

Imagem de teste nรบmero 13 do lote de testes CIFAR-10, mostrando um cavalo em tons de cinza.

Para avaliar o modelo, vocรช usarรก o valor de pixel desta imagem e verificarรก se o codificador consegue reconstruir a mesma imagem apรณs reduzi-la para 1024 pixels. Observe que vocรช definirรก uma funรงรฃo para avaliar o modelo em diferentes imagens. O modelo deverรก funcionar melhor apenas com imagens de cavalos.

A funรงรฃo leva dois argumentos:

  • df: Importe os dados de teste
  • image_number: indique qual imagem importar

A funรงรฃo รฉ dividida em trรชs partes:

  1. Remodele a imagem para a dimensรฃo correta, ou seja, 1, 1024
  2. Alimente o modelo com a imagem invisรญvel, codifique/decodifique a imagem
  3. Imprima a imagem real e reconstruรญda
def reconstruct_image(df, image_number = 1):
    ## Part 1: Reshape the image to the correct dimension i.e 1, 1024
    x_test = df[image_number]
    x_test_1 = x_test.reshape((1, 32*32))
    
    ## Part 2: Feed the model with the unseen image, encode/decode the image
    with tf.Session() as sess:     
        sess.run(tf.global_variables_initializer()) 
        sess.run(iter.initializer, feed_dict={x: x_test_1,
                                      batch_size: 1})
    ## Part 3:  Print the real and reconstructed image
      # Restore variables from disk.
        saver.restore(sess, "./model.ckpt")  
        print("Model restored.")
      # Reconstruct image
        outputs_val = outputs.eval()
        print(outputs_val.shape)
        fig = plt.figure()
      # Plot real
        ax1 = fig.add_subplot(121)
        plot_image(x_test_1, shape=[32, 32], cmap = "Greys_r")
      # Plot estimated
        ax2 = fig.add_subplot(122)
        plot_image(outputs_val, shape=[32, 32], cmap = "Greys_r")
        plt.tight_layout()
        fig = plt.gcf()

Agora que a funรงรฃo de avaliaรงรฃo estรก definida, vocรช pode dar uma olhada na imagem reconstruรญda de nรบmero treze.

reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckpt
Model restored.
(1, 1024)

A figura mostra a imagem de teste original ร  esquerda e a saรญda do autoencoder ร  direita, facilitando a avaliaรงรฃo da perda de detalhes apรณs a compressรฃo de 1024 para 150.

Comparaรงรฃo lado a lado da imagem original do cavalo e da reconstruรงรฃo mais desfocada gerada pelo autoencoder.

Perguntas Frequentes

Ambos reduzem as dimensรตes, mas a PCA รฉ limitada a projeรงรตes lineares. Um autoencoder empilha ativaรงรตes nรฃo lineares, como a ELU, capturando assim estruturas curvas que a PCA nรฃo detecta. Com uma รบnica camada linear e erro quadrรกtico, um autoencoder reproduz a PCA quase exatamente.

Nรฃo sofreu alteraรงรตes. O mรณdulo tf.contrib foi removido, e os espaรงos reservados e as sessรตes foram movidos para tf.compat.v1. A adiรงรฃo de disable_v2_behavior() permite a rรกpida migraรงรฃo das listagens, enquanto uma funรงรฃo nativa TensorFlow A segunda reescrita utiliza tf.keras.layers.Dense com inicializaรงรฃo GlorotUniform.

As ferramentas de busca automatizadas testam diversas larguras de camadas de codificaรงรฃo, ativaรงรตes e intensidades de regularizaรงรฃo muito mais rapidamente do que o ajuste manual, classificando os resultados por erro de reconstruรงรฃo. Isso encurta a busca, embora um humano ainda verifique se as reconstruรงรตes parecem adequadas aos dados em questรฃo.

Sim. Travas deslizantes portรกteis Copiloto do GitHub O cรณdigo gera um esboรงo da simetria do codificador e decodificador, do loop de treinamento e da funรงรฃo auxiliar de plotagem a partir de um breve comentรกrio, removendo a maior parte do cรณdigo repetitivo. Verifique vocรช mesmo os formatos dos tensores e a definiรงรฃo da funรงรฃo de perda, pois o cรณdigo gerado frequentemente mistura a sintaxe do TensorFlow 1 e 2.

Comece com uma largura entre dez e vinte por cento da largura de entrada, como a camada de 150 unidades faz para 1024 pixels neste caso. Poucas unidades desfocam os detalhes, enquanto muitas permitem que a rede copie a entrada em vez de aprender um cรณdigo compacto.

A escala de cinza condensa trรชs canais de cor em um, reduzindo cada entrada de 3072 para 1024 valores. O treinamento รฉ executado mais rapidamente, as camadas densas permanecem pequenas e a tarefa de reconstruรงรฃo ainda mostra claramente o que o autoencoder aprendeu.

A quantidade de impressรตes cai de 2,934 para cerca de 1,404 na รฉpoca 30, oscilando entรฃo entre 1,425 e 1,609. Uma taxa de aprendizado fixa de 0.01 ultrapassa o mรญnimo nesse ponto โ€” reduzi-la ou adicionar um cronograma de decaimento geralmente recupera o progresso.

Os usos em produรงรฃo incluem detecรงรฃo de anomalias em logs de servidor e transaรงรตes, onde um alto erro de reconstruรงรฃo sinaliza um valor discrepante, alรฉm de incorporaรงรตes de recomendaรงรฃo, remoรงรฃo de ruรญdo em sensores e extraรงรฃo de recursos de prรฉ-treinamento.tractors que alimentam um classificador subsequente.

Resuma esta postagem com: