[파이썬] Keras 자동 인코더 구축

이번 블로그 포스트에서는 Keras 라이브러리를 사용하여 자동 인코더(Autoencoder)를 구축하는 방법에 대해 알아보겠습니다. 자동 인코더는 비지도학습 알고리즘으로, 입력 데이터를 압축하여 효율적으로 표현할 수 있는 저차원의 특성을 학습하는 모델입니다. 이를 통해 데이터의 잠재적인 패턴을 추출하고, 이를 활용하여 데이터의 복원이나 특성 추출 등 다양한 작업에 활용할 수 있습니다.

Keras와 필요한 라이브러리 설치

우선 Keras를 사용하기 위해 필요한 라이브러리들을 설치해야 합니다. Python 패키지 관리자인 pip를 사용하여 다음과 같이 설치할 수 있습니다.

pip install keras
pip install tensorflow

또한, 자동 인코더를 구축하는 데 필요한 numpy, matplotlib 등의 라이브러리들도 함께 설치해주세요.

pip install numpy
pip install matplotlib

데이터 준비하기

자동 인코더를 학습시키기 위해 예제 데이터셋을 사용하겠습니다. 본 예제에서는 MNIST 숫자 데이터셋을 사용합니다. MNIST 데이터셋은 손으로 쓴 숫자 이미지 데이터로, 0부터 9까지의 숫자를 분류하는 작업에 많이 사용되는 데이터셋입니다. Keras에서는 다음과 같이 간단히 데이터를 불러올 수 있습니다.

from keras.datasets import mnist

(x_train, _), (x_test, _) = mnist.load_data()

데이터 전처리하기

데이터를 불러왔으면, 이를 전처리하여 모델에 입력해야 합니다. 자동 인코더는 입력 데이터를 압축하고 재구성하기 때문에, 주로 스케일링과 정규화 과정을 거칩니다. 아래의 코드는 데이터를 0과 1 사이로 스케일링하는 과정입니다.

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

모델 구축하기

이제 Keras를 사용하여 자동 인코더 모델을 구축해보겠습니다. 자동 인코더는 입력층, 은닉층, 출력층으로 구성됩니다. 은닉층은 입력 데이터를 압축하여 표현하는 역할을 합니다. 간단한 자동 인코더 모델을 구축하는 예시는 다음과 같습니다.

from keras.layers import Input, Dense
from keras.models import Model

input_img = Input(shape=(784,))
encoded = Dense(128, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)

autoencoder = Model(input_img, decoded)

위의 코드에서 input_img는 입력층을 나타내며, Dense를 이용하여 은닉층과 출력층을 추가합니다. 은닉층의 크기를 128로 설정하였고, 활성화 함수로는 ReLU(Recitified Linear Unit)를 사용하였습니다. 출력층의 크기는 입력층과 동일하게 784로 설정하였고, 활성화 함수로는 Sigmoid를 사용하였습니다.

모델 컴파일 및 학습

모델을 구축한 후, 이를 컴파일하고 학습시켜보겠습니다. 모델 컴파일은 다양한 설정을 적용하여 학습 과정을 정의하는 단계입니다. 아래의 코드는 자동 인코더 모델을 컴파일하는 예시입니다.

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

위의 코드에서 adam은 최적화 알고리즘으로, binary_crossentropy는 손실 함수(loss function)로 사용됩니다. 이제 모델 학습을 시작해보겠습니다.

autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test))

위의 코드에서 x_train은 입력 데이터, x_train은 출력 데이터로 사용되며, epochs는 에포크(epoch) 수, batch_size는 한 번에 처리할 데이터의 개수입니다. shuffle=True는 에포크마다 데이터 순서를 섞을 것인지를 결정하는 옵션입니다. 모델 학습이 완료된 후에는 학습 결과를 시각화하여 확인할 수 있습니다.

결과 확인하기

학습된 모델을 사용하여 입력 데이터를 복원해보고, 성능을 평가해보겠습니다. 아래의 코드는 학습된 모델을 사용하여 테스트 데이터의 복원 결과를 확인하는 예시입니다.

decoded_imgs = autoencoder.predict(x_test)

import matplotlib.pyplot as plt

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(decoded_imgs[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

plt.show()

위의 코드에서 decoded_imgs는 복원된 데이터를 나타내며, matplotlib를 이용하여 테스트 데이터와 복원된 데이터를 시각화합니다.

이제 자동 인코더를 구축하는 방법에 대해 알아보았습니다. 자동 인코더는 데이터의 특성 추출이나 데이터 복원 등 다양한 응용 분야에서 활용될 수 있습니다. Keras를 사용하면 간단하게 자동 인코더 모델을 구축하고 학습할 수 있으며, 학습된 모델을 사용하여 데이터를 복원하고 성능을 평가할 수 있습니다. 작성한 코드를 실행해보고 다양한 데이터셋에 적용해보세요!