AI_beginner/
└── 02_fashion_mnist/
    ├── models/
    │   ├── mlp_model.py
    │   └── cnn_model.py
    ├── train.py
    ├── compare.py
    ├── data/
    └── outputs/

위와 같은 구조로 설계했으며 train.py이 main과 같은 역학로 ?_model.pyimport하는 구조

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은 MLP 앞에 “이미지를 잘 읽는 학습 가능한 특징 추출기”가 붙은 형태

CNN의 한계성

⇒ 즉 CNN은 분류에 유용한 국소 패턴을 학습하는 모델 정도로 이해야함.

⇒ 보통 이런문제는 모델을 바꾸기 보다는 데이터증강(양치기), ResNet을 이용한다고 함.

CNN과 MLP의 비교실험

최종 결과

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