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.
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.

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:
- Importar os dados
- Converta os dados para o formato preto e branco
- Anexar todos os lotes
- Construa o conjunto de dados de treinamento
- 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.
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.
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.
Construir um autoencoder รฉ muito semelhante a qualquer outro modelo de aprendizado profundo.
Vocรช construirรก o modelo seguindo estas etapas:
- Defina os parรขmetros
- Defina as camadas
- Defina a arquitetura
- Defina a otimizaรงรฃo
- Execute o modelo
- 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.
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:
- Remodele a imagem para a dimensรฃo correta, ou seja, 1, 1024
- Alimente o modelo com a imagem invisรญvel, codifique/decodifique a imagem
- 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.




