computer vision(3) - Auto Encoder

적어야 머리에 남는다! ·2021년 12월 30일
0

Computer Vision

목록 보기
3/3

Encoding - Decoding

  • 인코딩 : 특정 파일을 특정 형태로 변화하는 과정

  • 인코더 : 잠재공간과 동일 , 특정 구조화된 값으로 매핑하는 함수

  • 디코딩 : 잠재공간에 의해 변형된 파일을 특정 형태로 복원하는 과정

  • 디코더 : 구조화된 값을 원래 형태로 복원하는 함수

오토인코더

  • 입력을 저차원 잠재공간으로 인코딩한 후 디코딩하여 복원하는 네트워크
    즉, 이미지를 입력받아 인코더 모듈을 사용하여 잠재 벡터 공간으로 매핑하고,
    디코더 모듈을 사용하여 원본 이미지와 동일한 차원으로 복원하여 출력

  • 원본 입력을 재구성하는 방법으로 학습 (원본 입력과 재구성된 자료와의 차이를 비교)

  • 고전적인 방식은 구조화가 잘된 잠재 공간을 만들지 못하고,
    압축도 뛰어나지 않음

실습

라이브러리, 데이터 가져오기


## 라이브러리
import tensorflow as tf

from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten, Reshape
from tensorflow.keras.losses import MeanSquaredError

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')

# 데이터 가져오기
(x_train, _), (x_test, _) = fashion_mnist.load_data()

# 정규화 - normalize

x_train = x_train.astype('float32')/255.
x_test = x_test.astype('float32')/255.


print(x_train.shape)
print(x_test.shape)

모델 정의 / 인코더-디코더


latent_dim = 64

class Autoencoder(Model):
  def __init__ (self,latent_dim):
    super(Autoencoder, self).__init__()

    self.latent_dim = latent_dim
    # encode - compress  
    self.encoder = tf.keras.Sequential([Flatten(), Dense(latent_dim,activation='relu')])
    #decode - decompress
    self.decoder = tf.keras.Sequential([Dense(784,activation = 'relu'), Reshape((28,28))])


  def call(self,x):
    encoded = self.encoder(x)
    decoded = self.decoder(encoded)
    return decoded
  • 잠재공간을 임의로 64로 지정
  • Flatten으로 압축
  • Dense로 다시 784로 바꾸고 Resahpe으로 형태 변환

모델 생성 및 컴파일


autoencoder = Autoencoder(latent_dim)
autoencoder.compile(optimizer='adam',loss= MeanSquaredError())

  • class instance할당
  • optimizer = 'adam'
  • loss = MSE

모델 학습

autoencoder.fit(x_train,x_train,
                epochs =10,
                shuffle=True,
                validation_data=(x_test,x_test))
  • 별도의 라벨을 파악하는 것이 아니라서 입력,목표 모두 x_train이용

모델 테스트

# 넘파이 리스트 형태로 결과값 만들기 
encoded_imgs = autoencoder.encoder(x_test).numpy()
decoded_imgs = autoencoder.decoder(encoded_imgs).numpy()


## 시각화 

n = 10 
plt.figure(figsize=(20,4))

for i in range(n):
  ax= plt.subplot(2, n, i+1)
  plt.imshow(x_test[i])
  plt.title('original')
  plt.gray()
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)

  ax= plt.subplot(2, n, i+1+n)
  plt.imshow(decoded_imgs[i])
  plt.title('reconstructed')
  plt.gray()
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)

plt.show()

  • 똑같이 복원이 되지는 않음 (epoch이 10회밖에 되지 않음)
  • 디테일은 떨어지지만 형태는 복원이 된 것을 확인할 수 있음
profile
기록을 통해 한 걸음씩 성장ing!

0개의 댓글