9주차 · CNN의 층별 연산과 Tensor shape

실습 전에

01 이미지의 특징

예시 상황 사진에서 경계나 무늬를 찾으려면, 픽셀 하나의 값 외에 무엇을 함께 살펴봐야 할까요?

설명
  • 경계·무늬 등은 인접 픽셀 간 관계로 나타남
  • Convolution: 작은 영역에 Filter를 적용하여 위치별 특징 계산

02 같은 특징을 찾는 방법

예시 상황 같은 무늬가 사진의 여러 위치에 나타납니다. 한곳에서 찾은 특징을 다른 위치에서도 찾도록 만들 수 있을까요?

설명
  • 같은 Parameter로 여러 위치의 특징을 검출
  • 위치마다 별도 Parameter를 두는 부담 감소. 모든 위치 변화에 대한 동일 출력은 보장하지 않음

실습

1. 간단한 CNN으로 각 층의 shape 확인하기

입력 shape는 (N,1,28,28)입니다. 아래 순서의 CNN을 구현하세요.

  1. Conv2d(1,32,3,padding=1) → ReLU() → MaxPool2d(2)
  2. Conv2d(32,64,3,padding=1) → ReLU() → MaxPool2d(2)
  3. Conv2d(64,128,3,padding=1) → ReLU() → MaxPool2d(2,padding=1)
  4. Flatten(start_dim=1) → Linear(2048,625) → ReLU()
  5. Dropout() → Linear(625,10)

각 Layer의 이름·예상 출력 shape·실제 출력 shape를 한 표에 기록하세요. 실행 전에 예상 열을 적고, 실행 결과와 다른 행이 있으면 어느 연산에서 크기가 달라졌는지 설명하세요.

2. Batch 크기와 parameter

  1. 앞 활동에서 만든 같은 CNN에 Batch Size N∈{1,8,32}N\in\{1,8,32\}의 입력을 각각 넣으세요. 입력의 나머지 축은 (1,28,28)로 유지하고 model.eval() 상태에서 실행합니다.
  2. NN, 최종 출력 shape, Parameter 수를 세 열로 기록하세요. Parameter 수는 sum(p.numel() for p in model.parameters())로 구하며, model은 본인이 만든 CNN입니다.
  3. 출력 shape가 각 행에서 (N,10)인지, Parameter 수는 세 행에서 같은지 대조하세요. Layer별 학습 가능한 Parameter 유무도 구분해 적으세요.

제출·저장

코드, 실제 Output·그래프, 직접 작성한 해석을 포함하세요. 제출은 KLAS를 이용하며 기한은 학기 일정과 최신 공지를 확인합니다.

파일명: 이름_학번_9주차.ipynb.

실행 환경을 다시 시작하고 전체 코드를 위에서부터 실행한 뒤 저장하세요.

선택 실습

입력 영상 크기와 Linear 입력 크기가 맞지 않는 경우

  1. 첫 번째 예제의 small 모델을 실행한 뒤, 노트북 맨 아래에 Code Cell을 추가하고 다음 코드를 실행하세요.
    for side in [32, 28]:
        debug_image = torch.randn(1, 1, side, side)
        with torch.no_grad():
            debug_features = small[:-1](debug_image)
            print("Input:", debug_image.shape,
                  "Flatten:", debug_features.shape,
                  "Linear in_features:", small[-1].in_features)
            try:
                print("Output:", small(debug_image).shape)
            except (RuntimeError, ValueError) as error:
                print(type(error).__name__, str(error))
  2. Text Cell에 영상 크기별 Flatten shape와 실행 성공 여부를 표로 적으세요. 두 경우 중 Linear가 요구하는 입력 수와 일치하는 것을 찾고, 오류가 발생한 경우에는 몇 개가 들어왔는지 적으세요.