AI · Deep Learning · Computer Vision · CNN

OUTTA Basic — PyTorch CNN과 손글씨 분류 오류 읽기

2026-08-01 · 수정 2026-08-01 · Hyeongrok Ryu

Convolution과 pooling의 shape를 따라가고, 저장된 loss·accuracy·오분류 이미지를 함께 읽은 CNN 공부 기록이다.

Series
2024 OUTTA AI 부트캠프 Basic · 3
유형 / 난이도
study-note · beginner
Tools
Python, PyTorch, Matplotlib
01Convolution shape부터 확인

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

02입력 이미지를 먼저 보기

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

03Loss와 accuracy 같이 보기

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

04맞힌 예와 틀린 예

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

이 글의 목차에서 자동으로 만든 개념 흐름도입니다.

Convolution shape부터 확인

먼저 CNN이 무엇인지 filter 그림만 외우지 않고 입력과 출력 shape로 정리했다. 92쪽 CNN 모듈에서 kernel, stride, padding을 확인한 뒤 다음 식으로 한 축의 크기를 계산했다.

H(out) = floor((H(in) + 2P − K) / S) + 1

Notebook을 실행했을 때 flatten 뒤 feature 수가 Linear 입력과 맞지 않는 부분을 먼저 확인했다. forward 중간에 shape를 출력해 convolution과 pooling이 공간 크기를 어떻게 줄이는지 따라갔다.

입력 이미지를 먼저 보기

14쪽 Dataset·DataLoader 모듈을 보면서 batch를 만들기 전에 sample과 label을 함께 그렸다. 손글씨는 같은 숫자라도 굵기·기울기·위치가 크게 달랐다. 이 차이를 보지 않고 accuracy만 읽으면 모델이 어떤 변형을 어려워하는지 알 수 없었다.

Label과 함께 배열한 손글씨 숫자 열여섯 개
기울기와 획 모양이 다른 입력을 batch 단위로 먼저 살펴봤다.

Loss와 accuracy 같이 보기

내가 수정한 CNN Notebook은 28개 code cell 중 2개가 기본본과 달랐고, 17개의 output object와 5개의 그림이 남아 있었다. 당시 저장된 curve에서는 loss가 전체적으로 줄고 accuracy가 높은 구간에 도달했지만 작은 validation set에서는 한두 sample만 바뀌어도 값이 크게 흔들릴 수 있다.

맞힌 예와 틀린 예

정답을 맞힌 1은 세로획이 뚜렷했다. 반대로 오분류 모음에서는 열린 고리, 붙은 획, 기울어진 선 때문에 5→3, 4→9, 7→9처럼 모양이 가까운 class로 이동했다. 다음 실험을 생각할 때는 무작정 layer를 늘리기보다 normalization, crop, augmentation 순서로 확인하는 편이 낫다고 정리했다.

최소 CNN forward

class SmallCNN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.features = torch.nn.Sequential(
            torch.nn.Conv2d(1, 16, kernel_size=3, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(2),
            torch.nn.Conv2d(16, 32, kernel_size=3, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(2),
        )
        self.classifier = torch.nn.Linear(32 * 7 * 7, 10)

    def forward(self, x):
        features = self.features(x)
        return self.classifier(features.flatten(1))

전이학습과 연결

26쪽 전이학습 모듈에서는 작은 CNN을 처음부터 학습하는 경우와 pretrained feature extractor를 쓰는 경우를 구분했다. 입력 channel·resize·normalization을 backbone이 기대하는 형식에 맞추고, 먼저 classifier만 학습한 뒤 필요할 때 일부 block을 푸는 순서로 정리했다.

사용한 자료

  • CNN — course-pdf; convolution, pooling, image classification
  • Dataset과 DataLoader — course-pdf; batch와 split 구성
  • 전이학습 — course-pdf; feature extractor와 fine-tuning 구분
논문 첫 페이지 미리보기