AutoEncoder의 이해

박재한·2022년 6월 24일
0

Deep Learning

목록 보기
15/22
post-custom-banner

참고1
참고2

1. AutoEncoder 개념과 구조

1.1 AutoEncoder 개념

  • 비지도 학습(unsupervised learning) 인공지능
  • 입력 데이터를 가공하여 목표값을 출력하는 방식이 아니라서 목표값(label 정보)이 없는 데이터 특성을 분석하거나 추출하는 용도로 사용된다.(대표적인 예로 이미지 노이즈 제거, 이상 탐지 등이 있다. 뒤에 실사용 예제에서 다시 다룬다.)

1.2 AutoEncoder 구조

입력과 출력이 동일하며 좌우 대칭으로 구축된 구조이다.
Imgur

  • 인코더(Encoder) : 인지 네트워크(Recognition Network)라고도 하며, 입력을 내부 표현으로 변환한다.
  • 디코더(Decoder) : 생성 네트워크(Generative Network)라고도 하며, 내부 표현을 출력으로 변환한다.

1.3 Stacked AutoEncoder 구조

여러 개의 은닉 계층(hidden layer)을 가지는 AutoEncoder이다.
Imgur

  • 부호화(encoding) 과정
    1. 입력 계층에서 들어온 다차원 데이터는 차원을 줄이는 은닉 계층으로 들어간다.
    2. 은닉 계층의 출력이 곧 encoding의 결과이다.
  • 복호화(decoding) 과정
    1. 은닉 계층에서 출력한 부호화(encoding) 결과는 은닉 계층의 복호화(decoding) 과정으로 입력되는데 복호화(decoding) 과정의 노드 수는 부호화(encoding) 과정의 노드 수보다 많다. 즉 더 높은 차원의 데이터로 돌아간다.
    2. 최종 출력은 입력 계층과 노드 수가 동일하다.

2. Denoising AutoEncoder 개념과 구조

2.1 Denoising AutoEncoder

입력 데이터에 노이즈(noise)를 추가한 것이다.
Imgur
Denoising AutoEncoder의 처리 결과의 한 예이다. 다음과 같다.
Imgur
Imgur

3. Convolutional AutoEncoder 개념과 구조

AutoEncoder에 합성곱(convolution)을 사용한 것으로 CNN으로 구현된다. 현재 대부분의 AutoEncoder가 이 방식을 사용한다.

3.1 Convolutional AutoEncoder

AutoEncoer에 합성곱(convolution) 계층을 이용한 것으로 이미지 처리에 매우 효과적이다.
Imgur

  • Convolution AutoEncoder 연산 과정
    Imgur

3.2 Transpose convolution에서 padding의 의미

Transpose convolution은 encoding 과정에서 크기가 축소된 이미지를 다시 크기를 키우는 것이다.

  • Padding = 0: feature map 주변에 0의 값을 갖는 pad를 (filter width(or height) - 1) 만큼 덧대는(padding) 것
  • Padding = 1: feature map 주변에 1의 값을 갖는 pad를 (filter width(or height) - 1) 만큼 덧대는(padding) 것
    Imgur
    그림의 Transpose Convolution을 보고 이해가 잘 안갈수도 있는데, Upsampling에 대한 것은 추후 별도로 다루도록 하겠다!

4. 이미지 노이즈 제거(Image Denoising)

오토인코더가 의미있는 특성(feature)을 학습하도록 제약을 주는 다른 방법은 입력에 노이즈(noise, 잡음)를 추가하고, 노이즈가 없는 원본 입력을 재구성하도록 학습시키는 것이다. 노이즈는 아래의 그림처럼 입력에 가우시안(Gaussian) 노이즈를 추가하거나, 드롭아웃(dropout)처럼 랜덤하게 입력 유닛(노드)를 꺼서 발생 시킬 수 있다.
Imgur

4.1 Convolutional AutoEncoder를 이용한 이미지 노이즈 제거 예제

이 예제는 Tensorflow의 keras API를 이용한 것으로 encoder에 Conv2D 레이어를 사용하고 decoder에 Conv2DTranspose 레이어를 사용하여 컨볼루셔널 autoencoder를 훈련한다. 본 예제는 흑백 이미지를 예로 들어서 이미지의 채널수가 1로 되어있지만 컬러 이미지의 경우는 R,G,B의 3채널이라 Inpus값 및 최종 출력의 채널을 3으로 한다.

  • 모델 구현
class Denoise(Model):
  def __init__(self):
    super(Denoise, self).__init__()
    self.encoder = tf.keras.Sequential([
      layers.Input(shape=(28, 28, 1)), 
      layers.Conv2D(16, (3,3), activation='relu', padding='same', strides=2),
      layers.Conv2D(8, (3,3), activation='relu', padding='same', strides=2)])

    self.decoder = tf.keras.Sequential([
      layers.Conv2DTranspose(8, kernel_size=3, strides=2, activation='relu', padding='same'),
      layers.Conv2DTranspose(16, kernel_size=3, strides=2, activation='relu', padding='same'),
      layers.Conv2D(1, kernel_size=(3,3), activation='sigmoid', padding='same')])

  def call(self, x):
    encoded = self.encoder(x)
    decoded = self.decoder(encoded)
    return decoded
  • 학습
autoencoder = Denoise()
autoencoder.compile(optimizer='adam', loss=losses.MeanSquaredError())
autoencoder.fit(x_train_noisy, x_train,
                epochs=10,
                shuffle=True,
                validation_data=(x_test_noisy, x_test))

4.2 학습 결과 예

keras fashion MNIST 데이터셋으로 위의 이미지 노이즈 제거 모델을 학습한 다음의 결과는 다음과 같다.
Imgur

5. 이상 감지

AutoEncoder를 이용한 이상 감지의 한 예로 정상적인 심전도 데이터를 다수 학습하여 비정상적인 심전도 데이터를 감지해 내는 것이다.
ECG5000 데이터 세트에는 140개의 데이터 포인터(feature로 추정됨) 5000개의 심전도 데이터가 있는데 각 심전도 데이터에는 0(비정상), 1(정상)으로 label이 되어 있다. 이들 중 정상으로 labeling된 데이터로만 AutoEncoder로 학습한다. 그러면 주어진 데이터에 관해서 가능한 정상적인 데이터로 재구성하려고 할 것인데 입력 데이터가 정상이면 AutoEncoder로 재구성된 출력데이터와 입력 데이터와의 오차가 크지가 않을 것이고 입력 데이터가 비정상으로 분류될 데이터이면 출력 데이터와 오차가 상대적으로 클 것이고 이 오차가 임계값을 초과하는 경우 비정상 데이터로 분류를 한다.
다음은 정상인 데이터를 AutoEncoder로 재구성했을 때의 오차를 그래프로 표시한 것이다.
Imgur
다음은 비정성인 데이터를 AutoEncoder로 재구성했을 때의 오차를 그래프로 표시한 것이다.
Imgur
예측할 데이터 세트에 대해서 오차가 임계치를 벗어나면 비정상인 경우로 판단하는데 이 임계치의 값을 적절히 조정해서 정밀도(Precision)와 재현율(Recall)을 높이는 쪽으로 조정한다.

profile
바쁘게 부지런하게 논리적으로 살자!!!
post-custom-banner

0개의 댓글