AI_beginner/
└── 02_fashion_mnist/
├── models/
│ ├── mlp_model.py
│ └── cnn_model.py
├── train.py
├── compare.py
├── data/
└── outputs/
위와 같은 구조로 설계했으며 train.py이 main과 같은 역학로 ?_model.py를 import하는 구조
python train.py --model mlp
python train.py --model cnn
class FashionCNN(nn.Module):
def __init__(self):
super().__init__()
self.feature_extractor = nn.Sequential(
# 입력: 1×28×28
nn.Conv2d(1, 16, kernel_size=3, padding=1),
*1: 입력 채널 수. 흑백 이미지라 1채널
16: 출력 채널 수. 서로 다른 특징맵 16개를 만듦
kernel_size=3: 3×3 크기의 작은 필터로 이미지를 훑음
padding=1: 이미지 가장자리에 0을 추가해줌 (kernel로 안나눠질때 대비)*
nn.ReLU(),
nn.MaxPool2d(kernel_size=2), # 16×14×14
kernel_size=2×2 영역마다 가장 큰 값으로 압축 => 이미지가 축소됨
=> 이에 따라 28 /2 된 14x14로 다음이 진행됨
즉, 16X14X14가 된 상태임
nn.Conv2d(16, 32, kernel_size=3, padding=1),
=> 이번에는 특징맵 16개로 들어온 위에 값을 32개 특징맵을 만들어 면밀하게 분석
nn.ReLU(),
nn.MaxPool2d(kernel_size=2) # 32×7×7
=> 이에 따라 14 /2 된 7x7로 다음이 진행됨
즉, 16X14X14가 된 상태임
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(32 * 7 * 7, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
Linear + ReLU = 그 특징으로 최종 분류
이미지 데이터를 매트릭스형태로 받는 것이 불가능함. 벡터로 길게 늘어뜨려 데이터를 입력받아 학습
CNN의 경우
이미지 데이터를 직접적으로 받아와 해석이 가능. 아래와 같은 프로세스를 통해 이미지를 이해
이미지 → Convolution(특징추출) → Pooling(압축) 을 반복해서 최종 출력을 생성
그렇게 만들어진 야무지게 알자배기를 MLP로 조져서 클래스 결과를 얻음
⇒ 즉, CNN은 MLP 앞에 “이미지를 잘 읽는 학습 가능한 특징 추출기”가 붙은 형태
⇒ 즉 CNN은 분류에 유용한 국소 패턴을 학습하는 모델 정도로 이해야함.
⇒ 보통 이런문제는 모델을 바꾸기 보다는 데이터증강(양치기), ResNet을 이용한다고 함.
최종 결과
Model: MLP Test Loss: 0.8464 Test Accuracy: 89.85% Training Time: 164.70초 Parameter Count: 235,146
최종 결과
Model: CNN Test Loss: 0.8565 Test Accuracy: 91.53% Training Time: 164.81초 Parameter Count: 206,922