Colab으로 하루에 하나씩 딥러닝

생성모델_1.오토인코더 본문

딥러닝_개념

생성모델_1.오토인코더

Elleik 2023. 2. 3. 22:47
728x90

오토인코더(Autoencoder)

  • 단순히 입력을 출력으로 복사하는 신경망 
  • 은닉층의 노드 개수가 입력 값보다 적음
  • 병목층은 입력과 출력의 뉴런보다 훨씬 적음

오토인코더 구성요소

1. 인코더

  • 인지 네트워크(recognition network)
  • 특성에 대한 학습을 수행하는 부분

2. 병목층(은닉층)

  • 모델의 뉴런 개수가 최소인 계층
  • 이 계층에서는 차원이 가장 낮은 입력 데이터의 압축 표현이 포함됨

3. 디코더

  • 생성 네트워크(generative network)
  • 병목층에서 압축된 데이터를 원래대로 재구성(reconstruction)하는 역할
  • 최대한 입력에 가까운 출력을 생성

4. 손실 재구성

  • 오토인코더는 압축된 입력을 출력층에서 재구성
  • 손실 함수는 입력과 출력의 차이를 가지고 계산

오토인코더 중요한 특징

1. 데이터 압축

  • 메모리 측면에서 상장한 장점
  • 중요 특성만 압축하면 용량도 적고 품질도 더 좋아짐

2. 차원의 저주 예방

  • 특성 개수를 줄여 주기 때문에 데이터 차원이 감소

3. 특성 추출

  • 오토인코더는 비지도 학습으로 자동으로 중요한 특성을 찾아줌

오토인코더 실습

### 라이브러리 호출

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

### 네트워크(신경망 생성)

input_image = tf.keras.layers.Input(shape=(784,))
encoded_input = tf.keras.layers.Dense(32, activation='relu')(input_image)
decoded_output = tf.keras.layers.Dense(784, activation='sigmoid')(encoded_input)
autoencoder = tf.keras.models.Model(input_image, decoded_output)

상세 설명

  1. 입력의 크기(784,)
  2. 입력을 인코딩에 적용
  3. 인코딩 출력을 디코딩에 적용하여 재구성 / 입력의 원래 크기로 변환
  4. 인코더와 디코더로 구성된 오토인코더 모델 생성

### 모델 컴파일

autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

### 데이터셋 준비

(X_train, _), (X_test, _) = tf.keras.datasets.mnist.load_data()
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
X_train = X_train.reshape((len(X_train), np.prod(X_train.shape[1:])))
X_test = X_test.reshape((len(X_test), np.prod(X_test.shape[1:])))

데이터셋 준비 완료


### 모델 훈련

autoencoder.fit(
    X_train,
    X_train,
    epochs=30,
    batch_size=256,
    shuffle=True,
    validation_data=(X_test, X_test)
)

모델 훈련 진행


### 이미지 시각화

reconstructed_img = autoencoder.predict(X_test)
n = 10
plt.figure(figsize=(20,4))
for i in range(n):
  ax = plt.subplot(2, n , i+1)
  plt.imshow(X_test[i].reshape(28,28))
  plt.gray()
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)

  ax = plt.subplot(2, n, i+1+n)
  plt.imshow(reconstructed_img[i].reshape(28,28))
  plt.gray()
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)
plt.show()

이미지 시각화 결과

 

참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)