입력과 출력이 동일하며 좌우 대칭으로 구축된 구조이다.
여러 개의 은닉 계층(hidden layer)을 가지는 AutoEncoder이다.
입력 데이터에 노이즈(noise)를 추가한 것이다.
Denoising AutoEncoder의 처리 결과의 한 예이다. 다음과 같다.
AutoEncoder에 합성곱(convolution)을 사용한 것으로 CNN으로 구현된다. 현재 대부분의 AutoEncoder가 이 방식을 사용한다.
AutoEncoer에 합성곱(convolution) 계층을 이용한 것으로 이미지 처리에 매우 효과적이다.
Transpose convolution은 encoding 과정에서 크기가 축소된 이미지를 다시 크기를 키우는 것이다.
오토인코더가 의미있는 특성(feature)을 학습하도록 제약을 주는 다른 방법은 입력에 노이즈(noise, 잡음)를 추가하고, 노이즈가 없는 원본 입력을 재구성하도록 학습시키는 것이다. 노이즈는 아래의 그림처럼 입력에 가우시안(Gaussian) 노이즈를 추가하거나, 드롭아웃(dropout)처럼 랜덤하게 입력 유닛(노드)를 꺼서 발생 시킬 수 있다.
이 예제는 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))
keras fashion MNIST 데이터셋으로 위의 이미지 노이즈 제거 모델을 학습한 다음의 결과는 다음과 같다.
AutoEncoder를 이용한 이상 감지의 한 예로 정상적인 심전도 데이터를 다수 학습하여 비정상적인 심전도 데이터를 감지해 내는 것이다.
ECG5000 데이터 세트에는 140개의 데이터 포인터(feature로 추정됨) 5000개의 심전도 데이터가 있는데 각 심전도 데이터에는 0(비정상), 1(정상)으로 label이 되어 있다. 이들 중 정상으로 labeling된 데이터로만 AutoEncoder로 학습한다. 그러면 주어진 데이터에 관해서 가능한 정상적인 데이터로 재구성하려고 할 것인데 입력 데이터가 정상이면 AutoEncoder로 재구성된 출력데이터와 입력 데이터와의 오차가 크지가 않을 것이고 입력 데이터가 비정상으로 분류될 데이터이면 출력 데이터와 오차가 상대적으로 클 것이고 이 오차가 임계값을 초과하는 경우 비정상 데이터로 분류를 한다.
다음은 정상인 데이터를 AutoEncoder로 재구성했을 때의 오차를 그래프로 표시한 것이다.
다음은 비정성인 데이터를 AutoEncoder로 재구성했을 때의 오차를 그래프로 표시한 것이다.
예측할 데이터 세트에 대해서 오차가 임계치를 벗어나면 비정상인 경우로 판단하는데 이 임계치의 값을 적절히 조정해서 정밀도(Precision)와 재현율(Recall)을 높이는 쪽으로 조정한다.