왜 Dense 말고 convolution 이냐
Dense 는 모든 입력을 모든 출력에 연결해 — feature vector 엔 괜찮은데 image 엔 재앙이야. 256×256 RGB 만 해도 벌써 ~20 만 개 숫자거든. Conv layer 는 spatial data 의 단순한 사실을 써먹어 — 왼쪽 위 모서리 edge 를 잡는 패턴이 오른쪽 아래 edge 잡는 패턴이랑 같다는 거. 그래서 작은 kernel 하나 학습해서 입력 전체에 슬라이드시키고 weight 를 사방에서 공유해. param 훨씬 적고 translation invariance 도 공짜.
image 의 main workhorse, Conv2D
Conv2D 가 기본. 인자: filters (출력 채널 수), kernel_size (커널 크기, e.g. 3 또는 (3,3)), strides (이동 간격), padding ('same' 또는 'valid'). Conv1D 는 sequence (text / audio), Conv3D 는 video / volumetric. depthwise / separable / dilated 변형은 효율 / receptive field 조절용.
출력 shape 를 정하는 두 인자
padding: 'valid' 는 패딩 없음 → layer 마다 (kernel - 1) 만큼 잘림. 'same' 은 테두리를 패딩해서 입력 spatial 크기 보존. strides: 슬라이딩 윈도우 보폭 — strides=2 면 각 spatial 차원 반 토막, pooling 없이 다운샘플하는 싸구려 방법. 이 둘만 잡으면 CNN shape 수학은 알아서 따라와. 기본은 Conv2D + 'same' 이 안전한 출발점.
param 아쉬울 땐 SeparableConv2D
SeparableConv2D 는 그냥 끼워 넣는 효율 교체품 — 표준 convolution 을 depthwise (채널당 필터 하나) + pointwise 1×1 (채널 섞기) 로 쪼개. 호출 시그니처 똑같고 param 은 대략 한 자릿수 줄어. 모바일급 architecture 들이 이거에 기대는 이유야.