강의자료 · 인공지능응용

CNN의 층별 연산과 Tensor shape

본인 사본을 만들어 실행·수정·기록하세요.

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

먼저 Conv Layer가 하나인 모델을 실행한 뒤, Conv Layer가 세 개인 CNN을 직접 만들어봅니다.

A. 기준 예제 · 먼저 읽고 실행

import sys, numpy as np, matplotlib.pyplot as plt
import torch
from torch import nn
import torch.nn.functional as F
torch.manual_seed(42)
torch.set_num_threads(2)
print('Python:', sys.version.split()[0], '| PyTorch:', torch.__version__)
small=nn.Sequential(nn.Conv2d(1,4,3,padding=1),nn.ReLU(),nn.MaxPool2d(2),nn.Flatten(1),nn.Linear(4*14*14,10))
x=torch.randn(8,1,28,28)
for layer in small:
    x=layer(x);print(type(layer).__name__,tuple(x.shape))
assert x.shape==(8,10)

B. 직접 수행

입력 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를 한 표에 기록하세요. 실행 전에 예상 열을 적고, 실행 결과와 다른 행이 있으면 어느 연산에서 크기가 달라졌는지 설명하세요.

예상은 정확한 수치 대신 shape나 증가·감소 방향으로 적어도 됩니다. 코드는 위 예제를 참고해 작성하고, 설명만 묻는 항목은 아래 Text Cell에 답하세요.

# ✍ 직접 작성: 이 셀 아래에 본인의 코드를 추가하세요.
# 코드가 길어지면 Code Cell을 추가해도 됩니다.

C. 직접 기록 · 이 Text Cell을 더블클릭해서 수정

2. Batch 크기와 parameter

Batch 크기는 한 번에 넣는 이미지 수입니다. 이미지 수를 바꿔도 Filter와 Weight의 개수는 바뀌지 않는지 확인합니다.

A. 기준 예제 · 먼저 읽고 실행

for batch in [1,8,32]:
    print('batch:',batch,'output:',small(torch.randn(batch,1,28,28)).shape)
print('parameters:',sum(p.numel() for p in small.parameters()))

B. 직접 수행

  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 유무도 구분해 적으세요.

예상은 정확한 수치 대신 shape나 증가·감소 방향으로 적어도 됩니다. 코드는 위 예제를 참고해 작성하고, 설명만 묻는 항목은 아래 Text Cell에 답하세요.

# ✍ 직접 작성: 이 셀 아래에 본인의 코드를 추가하세요.
# 코드가 길어지면 Code Cell을 추가해도 됩니다.

C. 직접 기록 · 이 Text Cell을 더블클릭해서 수정

반복 숙달 · 실행 전에 판단하기

앞의 직접 수행에서 비교한 조건 세 가지를 이 표에 정리하세요. 이미 수행한 실험을 다시 추가할 필요는 없습니다. 비교가 부족하면 한 조건만 바꾸어 보충하세요.

변경 조건 예상 shape/수치/결과 실제 결과 오류가 있었다면 원인
⟦직접 입력 1⟧ ⟦직접 입력⟧ ⟦직접 입력⟧ ⟦직접 입력⟧
⟦직접 입력 2⟧ ⟦직접 입력⟧ ⟦직접 입력⟧ ⟦직접 입력⟧
⟦직접 입력 3⟧ ⟦직접 입력⟧ ⟦직접 입력⟧ ⟦직접 입력⟧
# ✍ 반복 실험 코드

선택 실습 · 오류의 원인을 찾아 코드 고치기

입력 영상 크기와 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가 요구하는 입력 수와 일치하는 것을 찾고, 오류가 발생한 경우에는 몇 개가 들어왔는지 적으세요.

저장 전 확인

  1. 작성란과 출력·그래프를 확인하고 새 런타임에서 전체 셀을 순서대로 실행하세요.
  2. 본인 Drive에 저장한 뒤 .ipynb로 내려받으세요.

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

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