파이썬 딥러닝

파이썬 오토인코더

꼬마곰 2021. 8. 4. 16:55
반응형
오토인코더는 입력을 출력으로 복사하는 신경망입니다.
은닉층의 노드 개수가 입력 값보다 적은 것이 특징입니다.
입력과 출력은 동일한 이미지라고 예상할 수 있습니다.

 

오토인코더의 은닉층은 입력과 출력의 뉴련보다 굉장히 적습니다.

적은 수의 은닉층 뉴런으로 데이터를 가장 잘 표현할 수 있는 방법이 오토인코더입니다.

오토인코더는 주요부분은 네 가지로 구성됩니다.

 

TIP 은닉층이란?
 신경망 학습에서 모든 입력 노드들로부터 입력값을 받아 가중치를 계산하는 부분으로 가중치의 수정으로 인한 학습이 진행되는 부분이다. 완료된 학습 데이터를 출력층으로 전달한다.

 

1. 인코더 : 인지 네트워크(recognition network)라고도 하며 특성에 대한 학습을 수행하는 부분입니다.

 

2. 은닉층 : 모델의 뉴런 개수가 최소인 계층. 차원이 가장 낮은 입력 데이터의 압축 표현이 포함됩니다.

 

3. 디코더 : 생성네트워크(generative network)라고도 하며 이 부분은 은닉층에서 압축된 데이터를 원래대로 재구성하는 역할을 합니다. 입력값과 최대한 가까운 출력을 생성하도록 합니다.

 

4. 손실재구성 : 오토인코더는 입력층과 출력층의 뉴런개수가 도일한 것을 재외하면 다층퍼셉트론(Multi-Layer Perceptron)과 구조가 동일합니다.

 

 

오토인코더의 주요 특징으론 데이터 압축, 차원의 저주 예방, 특성 추출이 있습니다.

 

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt​
input_image = tf.keras.layers.Input(shape=(784,))
# 입력 크기 (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)
# 오토인코더 모델 생성
autoencoder.compile(optimizer = 'adam', loss = 'binary_crossentropy')
# 손실 함수와 옵티마이저 설정
(X_train, _), (X_test, _) = tf.keras.datasets.mnist.load_data()
# 케라스에서 제공하는 MINIST데이터 셋
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 = 25,
    batch_size = 300, 
    shuffle = True, 
    validation_data = (X_test, X_test))

reconstructed_img = autoencoder.predict(X_test)
n = 5 # 입력, 출력 이미지 5개
plt.figure(figsize=(7, 3))
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()​

 

반응형