3×3 필터를 이미지 위에서 밀며 곱하고 더하면, 선·모서리 같은 특징이 저절로 드러나요. 합성곱 → ReLU → 풀링의 신호 흐름을 직접 만져 보세요.
읽는 법: 입력은 진할수록 픽셀 값이 1에 가까워요 (클릭·드래그로 그리기, 지우개 토글로 지우기). 특징 맵과 풀링 결과는 양수 = 파랑, 음수 = 주황이고 절댓값이 클수록 진해요 (최댓값 기준 정규화). 특징 맵 위에 마우스를 올리면 그 값이 입력의 어느 3×3 창에서 계산됐는지 노란 테두리로 보여줘요.
프리셋을 고른 뒤에도 캔버스 위에서 자유롭게 덧그릴 수 있어요.
칸을 직접 수정해서 나만의 필터를 만들어 보세요. 진짜 CNN은 이 9개 숫자를 학습으로 스스로 찾아요.
12×12가 3×3 필터를 지나면 10×10이 되고 (12 − 3 + 1), 2×2 풀링을 지나면 절반인 5×5가 돼요. 최댓값 위치는 필터가 가장 강하게 반응한 곳 — 찾는 특징이 거기 있다는 뜻이에요.
import torch
import torch.nn as nn
# 흑백 이미지 1장: (배치, 채널, 높이, 너비) = (1, 1, 12, 12)
x = torch.rand(1, 1, 12, 12)
conv = nn.Conv2d(1, 8, kernel_size=3) # 3×3 필터 8장 (학습으로 찾음)
relu = nn.ReLU() # 음수는 0으로
pool = nn.MaxPool2d(2) # 2×2 창에서 최댓값만
h = conv(x) # 필터를 밀며 곱하고 더하기
print(h.shape) # torch.Size([1, 8, 10, 10]) ← 필터 8장이라 채널 8
h = relu(h)
h = pool(h)
print(h.shape) # torch.Size([1, 8, 5, 5])
# 진짜 CNN은 이 블록을 여러 층 쌓고, 마지막에 펼쳐서 MLP로 분류해요