Data Analyst KIM

[Deep Learning] 오토인코더(Auto-Encoder)란 무엇인가? 본문

데이터 분석/ML&DL&NLP

[Deep Learning] 오토인코더(Auto-Encoder)란 무엇인가?

김두연 2023. 10. 26. 17:30
반응형

오토인코더(Auto-Encoder, AE)란?

  • 가상의 이미지를 만드는, 또 하나의 알고리즘
  • GAN과 비슷하지만 다른 성질을 지니고 있음
    • GAN : 세상에 존재하지 않는 완전한 가상의 것을 만듬
    • 오토인코더 : 입력 데이터의 특징을 효율적으로 담아낸 이미지를 생성
  • 오토인코더 활용 : 영상 의학 분야 등 데이터 수가 충분하지 못한 분야

 

오토인코더의 구조

 

오토인코더의 학습 과정

  • 소실된 데이터를 복원하기 위해 학습을 시작하고,
  • 입력 데이터의 특징을 효율적으로 응축한 새로운 출력이 나오는 원리
  • 인코더 : 차원 축소 
  • 디코더 : 이미지 생성 모델
  • 비지도 학습 : 손실 함수 - rmse 사용
  • 지도 학습    : 손실 함수 - 크로스 엔트로피

 

오토인코더 모델 구현

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, Flatten, Reshape

import matplotlib.pyplot as plt
import numpy as np

# MNIST 데이터셋을 불러옵니다.

(X_train, _), (X_test, _) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') / 255

# 생성자 모델
autoencoder = Sequential()

# 인코딩
autoencoder.add(Conv2D(16, kernel_size=3, padding='same', input_shape=(28,28,1), activation='relu'))
autoencoder.add(MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(Conv2D(8, kernel_size=3, activation='relu', padding='same'))
autoencoder.add(MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(Conv2D(8, kernel_size=3, strides=2, padding='same', activation='relu'))

# 디코딩 
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(16, kernel_size=3, activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(1, kernel_size=3, padding='same', activation='sigmoid'))

# 전체 구조를 확인
autoencoder.summary()

# 컴파일 및 학습을 하는 부분입니다.
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, validation_data=(X_test, X_test))

# 학습된 결과를 출력하는 부분입니다.
random_test = np.random.randint(X_test.shape[0], size=5)  # 테스트할 이미지를 랜덤하게 불러옵니다.
ae_imgs = autoencoder.predict(X_test)                     # 앞서 만든 오토인코더 모델에 집어 넣습니다.

plt.figure(figsize=(7, 2))                         # 출력될 이미지의 크기를 정합니다.

for i, image_idx in enumerate(random_test):        # 랜덤하게 뽑은 이미지를 차례로 나열합니다.
   ax = plt.subplot(2, 7, i + 1)
   plt.imshow(X_test[image_idx].reshape(28, 28))   # 테스트할 이미지를 먼저 그대로 보여줍니다.
   ax.axis('off')
   ax = plt.subplot(2, 7, 7 + i +1)
   plt.imshow(ae_imgs[image_idx].reshape(28, 28))  # 오토인코딩 결과를 다음열에 출력합니다.
   ax.axis('off')
plt.show()

 

반응형