1. Computer Vision
대표적인 Computer Vision 문제로는 Image Classification, Object Detection, Neural Style Transfer 등등이 있다. 이러한 문제들은 보통 큰 해상도의 이미지를 입력으로 활용한다. 지금까지 우리는 입력 이미지를 모두 flatten 해서 NN에 넣어주었다. 하지만 해상도가 큰 이미지에 fully connected layer를 활용한다면, 계산해야 하는 parameter의 수가 너무 많아서 computational cost가 매우 커지게 될 것이다.
2. Edge detection & Convolution 연산
또 하나의 Computer Vision task로는 edge detection이 있다.

위의 그림과 같이, 이미지 내의 vertical edge와 horizontal edge를 찾는 것이다. ㅍertical edge의 예시를 살펴보면 아래와 같다.

입력 이미지에 대해, 위와 같은 weight를 가지는 3x3 크기의 filter로 convolution 연산을 수행하면 vertical edge를 얻을 수 있다.
우리가 배울 CNN은 3x3 filter 내의 weight를 edge detector와 같이 고정시키는 것이 아니다. Back propagation을 통해, 찾고자 하는 feature를 찾을 수 있도록 parameter로 설정해서 학습할 것이다. 이를 통해, vertical/horizontal edge뿐만 아니라, 다른 각도의 edge나 feature들을 detection 할 수 있을 것이다.
3. Padding & Stride
위와 같이 filter를 계속해서 적용하면 두 가지 단점이 존재한다.
- output 이미지의 크기가 계속 줄어든다.
- 이미지의 코너나 모서리 부분의 pixel 정보는 거의 활용하지 못한다.
따라서 우리는 이미지를 padding 하여 output 이미지의 크기를 조절할 수 있도록 한다.
그다음, filter를 몇 칸씩 이동해서 적용할 것인지를 stride라고 한다. stride=1인 경우, filter를 한 칸씩 이동시키면서 convolution 연산을 한다. stride=2인 경우는 filter를 두 칸씩 이동시키면서 convolution 연산을 한다.
- Output image의 크기 구하는 공식
$n$ x $n$ image, $f$x$f$ filter, padding $p$, stride $s$ 일 때,
Output image size = $(\frac{n+2p-f}{s} + 1)$ x $(\frac{n+2p-f}{s} + 1)$
4. Convolutions over volumes
지금까지는 2D 이미지에 대해 convolution 하는 방법을 배웠다. 하지만, 우리가 실제로 다뤄야 하는 이미지는 RGB 3 채널이 포함된 3D volumes이다. 아래 그림에서 RGB 이미지에 filter를 적용했을 때의 결과를 볼 수 있다.

우리는 검출하고자 하는 feature의 수만큼 filter를 사용하면 된다.
5. One layer of a CNN
- CNN의 one layer의 구성: filter 적용 -> bias 더하기 -> nonlinear function (e.g., ReLU)
- One layer의 parameter 수: $ (f \times f \times \#channels + 1(bias) ) \times \#filters $ --> FC layer와 다르게 입력 이미지 크기에 상관없이 parameter 수를 가진다.
- Summary of notation
: If layer $l$ is a convolution layer
| filter size | $f^{[l]}$ | padding | $p^{[l]}$ | stride | $s^{[l]}$ | # of filters | $n_{c}^{[l]}$ |
| Each filter | $f^{[l]} \times f^{[l]} \times n_{c}^{[l-1]}$ | Activations | $a^{[l]}=n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}$ | Weights | $f^{[l]} \times f^{[l]} \times n_{c}^{[l-1]} \times n_{c}^{[l]}$ | bias (*filter당 하나의 bias) | $n_{c}^{[l]}$ = (1, 1, 1, $n_{c}^{[l]}$) |
| Input | $n_{H}^{[l-1]} \times n_{W}^{[l-1]} \times n_{c}^{[l-1]}$ | Output | $n_{H}^{[l-1]} \times n_{W}^{[l-1]} \times n_{c}^{[l]}$ | ||||
| $n_{H}^{[l]}$ | $\frac{n_{H}^{[l-1]} + 2p^{[l]} - f^{[l]}}{s^{[l]}} + 1$ | $n_{W}^{[l]}$ | $\frac{n_{W}^{[l-1]} + 2p^{[l]} - f^{[l]}}{s^{[l]}} + 1$ | ||||
6. Pooling layer
: representation의 size를 감소시켜 빠른 계산을 도와줌. 좀 더 robust 한 feature detection을 도와줌.
- Max pooling: 커널 내에서 가장 큰 값만을 남김 / Average pooling: 커널 내의 값들의 평균값을 남김.
- 보통 Average Pooling보다는 Max Pooling을 많이 활용한다.

7. CNN example
: layer가 깊어질수록 image의 size는 줄어들고, channel 수는 깊어진다.

| Activation shape | Activation Size | # parameters | |
| Input | (32, 32, 3) | 3072 | 0 |
| CONV1 | (28, 28, 6) | 4704 | 608 |
| POOL1 | (14, 14, 6) | 1176 | 0 |
| CONV2 | (10, 10, 16) | 1600 | 3216 |
| POOL2 | (5, 5, 16) | 400 | 0 |
| FC3 | (120, 1) | 120 | 48120 |
| FC4 | (84, 1) | 84 | 10164 |
| Output | (10, 1) | 10 | 850 |
위의 표를 보면, FC layer가 입력의 크기에 비례하기 때문에, 대부분의 parameters가 FC layer에 있음을 확인할 수 있다.
8. Why convolution?
- Parameter sharing
: 한 이미지의 어떤 영역에서 유용한 feature detector (kernel)가 한 이미지의 다른 영역에서도 유용하다. 즉 한 이미지에 대해 하나의 필터만을 활용한다. - Sparsiry of connection
: 각 layer에서, 각 output value는 input의 $f \times f$ 영역 값에만 의존한다. input 픽셀의 필터 밖의 픽셀들의 영향 X - Translation invariance
: 몇 픽셀 이동한 이미지에도 유사한 feature를 가지고, 동일한 결과를 얻을 수 있다.