Autoencoder는 입력 데이터를 압축(Encoding)했다가 다시 복원(Decoding) 하는 신경망 구조다.
여기서 는 잠재 벡터(latent vector)다.
Denoising Autoencoder (DAE)
Sparse Autoencoder
Variational Autoencoder (VAE)
U-Net은 2015년 바이오메디컬 이미지 분할 논문에서 제안된 모델로, **픽셀 단위의 이미지 분할(Segmentation)**에 특화된 아키텍처다.
Contracting Path (인코더)
Bottleneck
Expansive Path (디코더)
디코더 단계에서의 skip connection은 다음과 같이 표현된다.
여기서
| 항목 | Autoencoder | U-Net |
|---|---|---|
| 목적 | 입력을 압축/복원 | 픽셀 단위 출력 (분할) |
| 구조 | Encoder + Decoder | Encoder + Decoder + Skip Connection |
| 정보 처리 | 잠재 벡터 z만 이용 | 저해상도 + 고해상도 정보 모두 이용 |
| 출력 형태 | 입력과 유사한 복원 | 입력과 동일 크기의 Segmentation Map |
| 주요 활용 | 차원 축소, 이상 탐지, 노이즈 제거 | 의료 영상, 자율주행, 이미지 분할 |
import torch.nn as nn
class Autoencoder(nn.Module):
def __init__(self):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(784, 128), nn.ReLU(),
nn.Linear(128, 64), nn.ReLU()
)
self.decoder = nn.Sequential(
nn.Linear(64, 128), nn.ReLU(),
nn.Linear(128, 784), nn.Sigmoid()
)
def forward(self, x):
z = self.encoder(x)
return self.decoder(z)
class UNet(nn.Module):
def __init__(self):
super().__init__()
self.down1 = nn.Sequential(nn.Conv2d(1,64,3,padding=1), nn.ReLU())
self.down2 = nn.Sequential(nn.Conv2d(64,128,3,padding=1), nn.ReLU())
self.up1 = nn.ConvTranspose2d(128,64,2,stride=2)
self.final = nn.Conv2d(64,1,1)
def forward(self, x):
d1 = self.down1(x)
d2 = self.down2(d1)
u1 = self.up1(d2)
u1 = u1 + d1 # skip connection
return self.final(u1)