logo

오토인코더

지도 학습 vs. 비지도 학습

  • 지도 학습 supervised learning
    • 일종의 정답이 있는 상태에서, 모델로 하여금 그 정답을 예측하도록 학습
    • X → Y 관계의 데이터에서 X로 Y를 예측(이미지 분류, 객체 인식 등)
    • X와 Y, 두 가지 데이터가 필요
    • Y에 해당하는 데이터가 반드시 필요하나 구하기 어려울 수도 있음
    • 예: 맛집 리뷰(X)가 진짜(Y)인가?
  • 비지도 학습 unsupervised learning
    • 데이터 구조와 관계를 파악하여 유용한 정보를 추출하는 것
    • 예) 인터넷 옷 쇼핑몰에서 비슷한 디자인 추천
    • 지도학습과 달리 데이터에 Y가 없음
    • 활용 결과를 바탕으로 판단

이미지 압축

  • 이미지 압축은 사진이나 그림 파일의 크기를 줄이는 기술
  • 저장 공간을 절약하고, 이미지를 빠르게 전송할 수 있음
  • 흔히 사용하는 GIF와 JPG에도 이미지가 압축되어 있음
  • 기존의 압축 방식은 고정된 알고리즘을 사용

JPEG의 압축 방법(1)

  • 색공간 변환(RGB → YCbCr): Y는 밝기, Cb, Cr은 색상.
  • 크로마 서브샘플링(chroma subsampling): 사람은 밝기에 민감하므로 Y는 보존, Cb, Cr을 압축
  • 인접한 픽셀에서 일부 색상만 남김

JPEG 크로마 서브샘플링 방식

JPEG의 압축 방법(2)

  • 블록 분할(block splitting): 채널을 일정 크기(예: 8x8)의 블록으로 분할
  • 이산 코사인 변환(discrete cosine transform): 각 블록의 이미지를 주파수로 변환
  • 양자화(Quantization): 주파수 영역의 계수들을 상수로 나눈 후, 반올림
    • 실수 → 정수로 바뀜
    • 고주파 영역을 큰 상수로 나누어 압축율을 높임
  • 일반적인 비손실 압축 알고리즘(Run-length encoding, Huffman coding 등)을 적용

JPEG 블록과 주파수 성분

DCT 계수 예시

JPEG 압축 방식의 문제점

  • 손실 압축이므로 이미지의 화질이 열화됨
  • 이미지의 종류와 상관없이 일괄적으로 고주파 영역을 깎아냄
  • 이미지의 '의미'가 보존되지 않음

JPEG 압축으로 화질이 열화된 이미지

오토인코더 autoencoder

  • 비지도 학습을 이용하면 이미지의 특성을 이용하여 압축할 수 있음
  • 오토인코더: 신경망 기반 비지도학습 모델
  • 이미지를 입력받아 간략한 표현(압축된 형태)을 생성한 뒤, 그 표현을 사용해 원본 이미지를 복원
  • 오토인코더는 인코더와 디코더로 구성
    • 인코더 encoder: 이미지를 간단한 표현으로 압축하는 역할
    • 디코더 decoder: 압축된 표현을 다시 원래 이미지로 복원하는 역할
  • 학습 과정에서는 원본 이미지와 복원된 이미지 사이의 차이를 줄이는 방향으로 모델이 개선
  • 비지도 학습을 이용한 이미지 압축의 경우, 오토인코더는 원본 이미지만 가지고 학습을 진행
  • 학습이 끝난 후에는 인코더로 이미지를 압축, 디코더로 이미지를 복원

오토인코더의 인코더와 디코더 구조

오토인코더

  • 오토인코더의 학습에는 사람이 붙여준 레이블이 없음
  • 지도학습에서는 이미지 X와 레이블 Y가 필요
  • 오토인코더와 같은 비지도 학습에서는 이미지 X만 필요
  • 지도와 비지도는 이 레이블 Y가 있느냐 없느냐를 나타냅니다.
  • 오토인코더는 이미지의 화질을 떨어트리지 않으면서 효율적으로 압축하기 위해 이미지가 가진 패턴들을 학습해야 함
  • 오토인코더는 응용하기에 따라 이미지 압축 외의 용도로도 쓸 수 있음
    • 예) 노이즈 제거
    • 원본 이미지에 노이즈를 넣어서 오토인코더에 입력
    • 압축을 했다가 푼 다음에 복원된 결과물이 노이즈가 없는 원본과 비슷하도록 학습
    • 이렇게 하면 오토인코더를 거치면 노이즈가 제거되도록 학습시킬 수 있음

준비

keras.utils.set_random_seed(42)

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

input_dim = 784
latent_dim = 32 # 압축 차원: 784 -> 32

인코더

encoder = keras.Sequential([
    keras.layers.Rescaling(1/255), # 입력 값의 범위를 0~1로
    keras.layers.Flatten(), # 이미지 평탄화
    keras.layers.Dense(128, activation="relu"),
    keras.layers.Dense(latent_dim, activation="relu", name="compressed")
], name="encoder")

디코더

decoder = keras.Sequential([
    keras.layers.Dense(128, activation="relu", input_shape=(latent_dim,)),
    keras.layers.Dense(input_dim, activation="sigmoid"),
    keras.layers.Reshape((28, 28))
], name="decoder")

오토인코더

inputs = keras.Input(shape=(28, 28), name="image")
z = encoder(inputs)
outputs = decoder(z)

autoencoder = keras.Model(inputs, outputs, name="mnist_autoencoder")

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

훈련

y_train = x_train / 255.0
y_test = x_test / 255.0

history = autoencoder.fit(
    x_train,
    y_train, # 입력과 정답이 같음(스케일링만 추가)
    epochs=5,
    batch_size=256,
    shuffle=True,
    validation_data=(x_test, y_test)
)

압축과 복원

compressed = encoder.predict(x_test[:10])  # 압축
reconstructed = autoencoder.predict(x_test[:10]) # 복원

시각화

import matplotlib.pyplot as plt

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

for i in range(n):
    ax = plt.subplot(2, n, i + 1)
    plt.imshow(x_test[i].reshape(28, 28), cmap="gray")
    ax = plt.subplot(2, n, i + 1 + n)
    plt.imshow(reconstructed[i].reshape(28, 28), cmap="gray")

MNIST 원본 이미지와 오토인코더 복원 이미지 비교

퀴즈

문제 1 / 7맞음: 0힌트: 0틀림: 0채점중: 0남음: 7

지도 학습과 비지도 학습을 구분하는 핵심 기준은 무엇입니까?

  • 레이블 Y가 있는지 여부
  • 이미지 크기가 28x28인지 여부
  • 모델에 Dense 레이어가 있는지 여부
  • 학습률이 0.001인지 여부

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
데이터 증강
Next
GAN