03. CNN (LeNet)

03. CNN (LeNet)

κ°œμš”

LeNet-5λŠ” Yann LeCun이 1998년에 μ œμ•ˆν•œ 졜초의 성곡적인 Convolutional Neural Networkμž…λ‹ˆλ‹€. 손글씨 숫자 인식(MNIST)μ—μ„œ λ›°μ–΄λ‚œ μ„±λŠ₯을 λ³΄μ—¬μ£Όμ—ˆμœΌλ©°, ν˜„λŒ€ CNN의 κΈ°μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


μˆ˜ν•™μ  λ°°κ²½

1. Convolution μ—°μ‚°

2D Convolution:
(I * K)[i,j] = Ξ£_m Ξ£_n I[i+m, j+n] Β· K[m, n]

μ—¬κΈ°μ„œ:
- I: μž…λ ₯ 이미지 (H Γ— W)
- K: 컀널/ν•„ν„° (k_h Γ— k_w)
- *: convolution μ—°μ‚°

좜λ ₯ 크기:
H_out = (H_in + 2P - K) / S + 1
W_out = (W_in + 2P - K) / S + 1

- P: padding
- S: stride
- K: kernel size

2. Pooling μ—°μ‚°

Max Pooling:
y[i,j] = max(x[i*s:i*s+k, j*s:j*s+k])

Average Pooling:
y[i,j] = mean(x[i*s:i*s+k, j*s:j*s+k])

λͺ©μ :
1. 곡간 해상도 κ°μ†Œ (down-sampling)
2. Translation invariance 증가
3. νŒŒλΌλ―Έν„°/κ³„μ‚°λŸ‰ κ°μ†Œ

3. Backpropagation through Convolution

Forward:
Y = X * W + b

Backward:

βˆ‚L/βˆ‚W = X * βˆ‚L/βˆ‚Y  (cross-correlation)

βˆ‚L/βˆ‚X = βˆ‚L/βˆ‚Y * rot180(W)  (full convolution)

βˆ‚L/βˆ‚b = Ξ£ βˆ‚L/βˆ‚Y

LeNet-5 μ•„ν‚€ν…μ²˜

μž…λ ₯: 32Γ—32 흑백 이미지

Layer 1: Conv (5Γ—5, 6 filters) β†’ 28Γ—28Γ—6
         + Tanh + AvgPool (2Γ—2) β†’ 14Γ—14Γ—6

Layer 2: Conv (5Γ—5, 16 filters) β†’ 10Γ—10Γ—16
         + Tanh + AvgPool (2Γ—2) β†’ 5Γ—5Γ—16

Layer 3: Conv (5Γ—5, 120 filters) β†’ 1Γ—1Γ—120
         + Tanh

Layer 4: FC (120 β†’ 84) + Tanh

Layer 5: FC (84 β†’ 10) (좜λ ₯)

νŒŒλΌλ―Έν„°:
- Conv1: 5Γ—5Γ—1Γ—6 + 6 = 156
- Conv2: 5Γ—5Γ—6Γ—16 + 16 = 2,416
- Conv3: 5Γ—5Γ—16Γ—120 + 120 = 48,120
- FC1: 120Γ—84 + 84 = 10,164
- FC2: 84Γ—10 + 10 = 850
- 총: ~61,706 νŒŒλΌλ―Έν„°

파일 ꡬ쑰

03_CNN_LeNet/
β”œβ”€β”€ README.md                      # 이 파일
β”œβ”€β”€ numpy/
β”‚   β”œβ”€β”€ conv_numpy.py             # NumPy둜 Convolution κ΅¬ν˜„
β”‚   β”œβ”€β”€ pooling_numpy.py          # NumPy둜 Pooling κ΅¬ν˜„
β”‚   └── lenet_numpy.py            # 전체 LeNet NumPy κ΅¬ν˜„
β”œβ”€β”€ pytorch_lowlevel/
β”‚   └── lenet_lowlevel.py         # F.conv2d μ‚¬μš©, nn.Conv2d λ―Έμ‚¬μš©
β”œβ”€β”€ paper/
β”‚   └── lenet_paper.py            # λ…Όλ¬Έ μ•„ν‚€ν…μ²˜ μ •ν™• μž¬ν˜„
└── exercises/
    β”œβ”€β”€ 01_visualize_filters.md   # ν•„ν„° μ‹œκ°ν™”
    └── 02_receptive_field.md     # 수용 μ˜μ—­ 계산

핡심 κ°œλ…

1. Local Connectivity

Fully Connected:
- λͺ¨λ“  μž…λ ₯이 λͺ¨λ“  좜λ ₯에 μ—°κ²°
- νŒŒλΌλ―Έν„°: H_in Γ— W_in Γ— H_out Γ— W_out

Convolution:
- 둜컬 μ˜μ—­λ§Œ μ—°κ²° (컀널 크기)
- νŒŒλΌλ―Έν„°: K Γ— K Γ— C_in Γ— C_out
- νŒŒλΌλ―Έν„° 곡유둜 효율적

2. Parameter Sharing

같은 ν•„ν„°κ°€ 이미지 전체에 적용
β†’ Translation equivariance
β†’ μ–΄λ–€ μœ„μΉ˜μ—μ„œλ“  같은 νŠΉμ§• 감지

3. Hierarchical Features

Layer 1: μ—£μ§€, μ½”λ„ˆ (μ €μˆ˜μ€€)
Layer 2: ν…μŠ€μ²˜, νŒ¨ν„΄ (μ€‘μˆ˜μ€€)
Layer 3: λΆ€λΆ„ 객체 (κ³ μˆ˜μ€€)
Layer 4+: 전체 객체 (의미둠적)

κ΅¬ν˜„ 레벨

Level 1: NumPy From-Scratch (numpy/)

  • Convolution을 λ£¨ν”„λ‘œ 직접 κ΅¬ν˜„
  • im2col μ΅œμ ν™”
  • Backpropagation μˆ˜λ™ κ΅¬ν˜„

Level 2: PyTorch Low-Level (pytorch_lowlevel/)

  • F.conv2d, F.max_pool2d μ‚¬μš©
  • nn.Conv2d λ―Έμ‚¬μš©
  • νŒŒλΌλ―Έν„° μˆ˜λ™ 관리

Level 3: Paper Implementation (paper/)

  • 원본 λ…Όλ¬Έ μ•„ν‚€ν…μ²˜ μž¬ν˜„
  • Tanh ν™œμ„±ν™” (ReLU λŒ€μ‹ )
  • Average Pooling (Max λŒ€μ‹ )

ν•™μŠ΅ 체크리슀트

  • [ ] Convolution μˆ˜μ‹ 이해
  • [ ] 좜λ ₯ 크기 계산 곡식 μ•”κΈ°
  • [ ] im2col 기법 이해
  • [ ] Conv backward μœ λ„
  • [ ] Max pooling backward 이해
  • [ ] LeNet μ•„ν‚€ν…μ²˜ μ•”κΈ°

참고 자료

to navigate between lessons