논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

UFLDL Tutorial 12. Supervised Convolutional Neural Network – Exercise: Convolution and Pooling

Exercise: Convolution and Pooling

Convolution and Pooling

이번 연습 문제에서는 convolution 과 pooling 함수를 테스트할 것입니다. 제공된 starter code에서 cnnConvolve.mcnnPool.m파일에서 "YOUR CODE HERE" 부분에 코드를 작성하면 됩니다.

Dependencies

이 연습 문제를 풀기 위해서는 아래의 추가 파일이 필요합니다.

MNIST Help function

Starter Code

Step 1: Implement and test convolution

먼저 첫번째 단계로 convolution 함수를 구현하고 테스트해야 합니다. 제대로 구현되었는지 확인하기 위해서 데이터셋의 일부에서만 구현하여도 됩니다.

Step 1a: Implement convonlution

앞의 에서 설명한 convolution을 구현하기 위해서 cnnConvolve.m내의 cnnConvolve함수를 구현하여야 합니다. Convolution을 구현하는 것은 복잡할 수 있으므로 전체 과정을 안내하고자 합니다.

우리가 계산하고자 하는 것은 유효한 $(r, c)$에서 $\sigma ( W x_{(r,c)} + b) $를 계산하는 것입니다. 여기서 유효하다는 뜻은 8 * 8 패치가 모두 이미지 안에 들어있어야 합니다. 이것은 이미지의 바깥을 0으로 가정하고 계산하는 full convolution과는 반대 개념입니다. $W, b$는 입력층으로부터 은닉층으로의 학습된 가중치와 bias입니다. $x_{(r, c)}$는 왼쪽 위 코너의 위치가 $(r, c)$인 8*8 패치를 의미합니다. Convolution을 계산할 때 단순하게 만든다면 모든 패치들에 대해서 루프를 돌면서 $\sigma ( W x_{(r,c)} + b) $를 계산하는 것입니다. 이론적으로는 틀린 것이 없지만 매우 느리게 동작할 것입니다. 따라서 보통은 MATLAB의 최적화된 내장 함수를 이용하여 convolution을 수행합니다.

위의 convolution 식은 다음의 3가지 단계로 나눌 수 있습니다. 첫번째로 모든 $(r, c)$에 대해서 $W_x{(r, c)}$를 계산하고, 다음 그 결과에 $b$를 더하는 작업입니다. 마지막으로 결과에 시그모이드 함수를 적용하는 단계입니. 첫번째 단계부터 루프가 필요하기 때문에 이렇게 나누는 것이 뭔가 더 좋아보이지는 않습니다. 하지만 첫번째 단계를 MATLAB의 최적화된 convolution 함수 conv2를 이용해서 작성하면 상당한 속도 향상이 있습니다.

다음, 각 convolvedFeatures에서 filterNum번째 필터에서 bias에 해당하는 $b$를 더해주어야 합니다.


구현 팁: conv2convn을 사용하세요. Convolution의 수학적인 정의는 convolve되는 행렬을 "flipping", 즉 행과 열을 뒤집어서 동작하게끔 되어있지만 MATLAB의 convolution 함수를 사용할 때에는 먼저 가중치 행열을 "flip"해주어서 MATLAB이 그것을 flip할 때에 수학적 정의에 맞는 정확한 위치에 연산되도록 하여야 합니다. 예를 들어 두개의 행렬 image (큰 이미지)와 W (특징)을 conv2(image, W)를 이용해서 convolution하는 상황을 생각해봅시다. W는 3 * 3 행렬로 아래와 같습니다.

$$ W = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{pmatrix} $$

이제 conv2(image, W)를 사용하면 MATLAB은 먼저 W를 flip하여 아래와 같이 행과 열을 반대로 만든 다음, convlution을 수행합니다.

$$ \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{pmatrix} \xrightarrow{flip} \begin{pmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \\ \end{pmatrix} $$

처음에 입력한 W가 올바른 모양이었다면 flip한 뒤에는 그 값이 올바르지 않게 될 것입니다. 따라서 올바른 convolution을 위해서는 conv2를 실행하기전에 먼저 W를 flip해 주어야 합니다. conv2를 사용할 때에는, 행과 열을 반대로 만들어 주면 되므로 W를 90도 회전시켜주는 함수 rot90를 이용하여 2번 회전 시켜주면 됩니다.

Step 1b: Check your convolution

주어진 코드에는 convolution을 제대로 구현하였는지를 검사하는 코드도 함께 들어있습니다. 이 코드는 랜덤하게 생성된 특징과 MNIST 데이터셋을 이용하여, 특징이나, 행, 열에 대한 무작위로 convolved된 값의 활성 값이 올바른지 검사합니다.

Step 2: Implement and test pooling

Step 2a: Implement pooling

cnnPool.m 파일 안의 cnnPool함수 부분에 pooling 과정을 구현합니다. 여기서는 특징 반응(feature responses)들에 대한 평균을 이용하는 mean pooling을 구현해야 합니다. 이 과정은 conv2함수를 이용하여 효과적으로 계산될 수 있습니다. 입력은 이전 단계에서 각 이미지에 각 필터를 적용한 반응 값을 사용합니다. 각각의 행렬들을 convolve한 뒤에는 서브샘플링과 평균 과정을 수행하게 됩니다. Convolution할 때에 "valid" 테두리를 사용하세요.

Step 2b: Check your pooling

마찬가지로 pooling이 제대로 되었는지 검사하는 코드가 들어있습니다. 이 코드는 테스트 행렬에 대해 cnnPool를 실행하여 원하는 결과가 생성되는지를 검사합니다.


Tags:
Add a Comment Trackback