본문 바로가기
딥러닝/딥러닝

[CS231N] Convolution Neural Network(CNN)

by DUSTIN KANG 2020. 9. 29.

Convolution Neural Network(CNN)

CNN은 사람의 시신경👁️을 모방한 딥러닝 구조로 2012년 이미지넷 분류 경진대회에서 AlexNet 덕분에 주목을 받기 시작했습니다.  AlexNet 논문을 자세히 보면  CNN의 특징으로 Stationarity of Statistics와 Locality of pixel dependencies가 짧게 언급됩니다. 

AlexNet 논문

 

여기서, Stationarity위치가 상관 없이 반복되는 특징을 말합니다. 시계열 데이터에서 시간 관계 없이 변하지 않는 특성을 말하기도 합니다. Stationarity가 왜 중요한 특징을 가지게 되냐면, 사진에서 같은 특징의 객체를 뽑아낸다고 하면 위치와 상관없이 같은 특징을 뽑아내야할 것입니다. 이때 모두 다른 특징이라고 인식해버리면 메모리나 연산량이 증가할 것입니다. 그래서 하나의 feature Map을 출력하기 위해 한장의 Filter만 사용하면 적은 양의 파라미터 수로 효율적으로 좋은 성능으로 예측할 수 있기 때문입니다. 이를 Parameter Sharing이라고 합니다.

Locality of pixel dependencies는 바운딩 박스 내에 있는 픽셀들 끼리만 종속을 갖고 그 외 전체적인 위치에서는 종속성이 없다는 것을 의미합니다.

 

CNN이 FCN보다 특별한 이유

CNN는 기존 Fully Connected Layer와 다르게 층이 깊어지더라도 이미지 분류가 가능하다는 점입니다. Fully Connected Layer는 이미지를 분류하기 위해 1차원 데이터로 Flattering 해야합니다. 이렇게 되면 공간적 특징을 무시하게 되는 것이죠. 결국 입출력 데이터의 형상을 유지할 수 있다는 점(공간적 특징 유지)이 특별하다는 것입니다. 이 둘의 차이점을 더해보자면, 효율적인 CNN이기 때문에 학습할 파라미터가 더 적다는 것입니다.

 

그렇다고 Fully Connected Layer를 완전히 배제할 순 없습니다.

CNN의 마지막 부분에도 Fully Connected Layer가 사용됩니다. 이 부분에 대해서는 뒷글에 보실 수 있습니다.

Convolution Neural Network

 

CNN의 단계는 크게 두가지로 나눌 수 있습니다. 차근차근 알아가보도록 합시다.

  • Feature Extraction(특징 추출) : Convolution Layer, Pooling Layer
  • Image Classification(이미지 분류) : Fully Connected Layer

Feature Extraction

Convolution Layer (합성곱 층)

Convolution Layer에서는 `Filter`가 이미지를 슬라이딩 하면서 Dot Product 연산을 해나갑니다. Filter는 이미지의 특징을 추출하기 위한 파라미터, Weight, 커널을 의미합니다.  필터는 입력 데이터에 Sliding Window방식으로 Stride 만큼 움직여 합성곱을 진행합니다. 합성곱이 끝난  Map은 활성화 함수(Activation Function - ReLU)를 적용하고 다음 레이어의 Input이 됩니다.

 

가로*세로*채널, 이미지와 필터의 채널은 같아야합니다.

 

Convolution Layer에서는 두가지 작업이 진행됩니다.

앞서 나왔듯이 Filter가 Stride 간격 만큼 움직여  새로운 특성을 만들어 냅니다. 여기서 Stride는 움직이는 간격을 의미합니다. 여기서 중요한 것은 Stride를 이미지에 맞게 설정해야한다는 것입니다. 만약 아래 그림 처럼 맞지 않게 설정하면 해당 필터를 적용할 수 없게 됩니다. 공식화해보면 다음과 같습니다. 

필요에 따라 bias 값도 추가할 수 있다.

반복적인 Convolution Layer로 Feature Map은 점점 줄어들 수 있습니다. 그럼 합성곱은 반복하다보면 추출한 특성의 배열이 점점 줄어들지 않을까라는 고민을 하게 될것입니다. Convolution Layer에는 출력 데이터가 줄어드는 것을 방지하기 위해 입력 데이터의 바깥 쪽으로 동일한 값을 채워 가장 자리 데이터를 보존하는 방법이 있습니다.  바로 Padding을 통해 데이터를 보존할 수 있습니다. 가장 자리 데이터를 보존하기 때문에 데이터를 좀 더 고르게 할 수 있다는 장점을 가지고 있습니다. 데이터의 바깥 쪽으로 동일한 값을 채워주는 역할을 합니다. 

총 파라미터 수는 필터의 개수와 (높이, 낮이, 채널)의 곱을 말합니다.

 

Pooling

풀링(Down Sampling)은 공간적인 정보를 유지하면서 크기를 줄여주는 층을 말합니다.

해당 영역에서 가장 큰 역할을 하는 특징(Maximum, 최댓값) 혹은 평균값, 최소값등을 통해 레이어의 특징이 제대로 드러납니다.

풀링층에서는 Stride와 Pooling의 크기를 같은 크기로 설정해 모든 원소가 한번씩 처리되도록 합니다. 해당 층에서는 딱히 파라미터가 없습니다. 

 


Image Classification

Fully Connected Layer

마지막으로, 이 값들을 전부 펴서(Strech) 1차원 벡터로 만들고 FC Layer의 입력으로 사용합니다. 이 부분에서  FCN을 사용하는 이유는 분류 즉, 추론만 진행하면 되기 때문에 공간적 특징을 굳이 신경 쓸 필요가 없기 때문입니다. FC Layer에서는 Softmax 함수를 이용해 Multiclass를 분류하게 됩니다. 


CNN for Pytorch

이번엔 실습을 진행해보려고 합니다. 자세한 코드는 해당 링크를 참조해서 확인하시면 됩니다.

코드 중에서 다음 CNN 모델을 정의하는 코드만 가져와봤습니다.

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()

        self.layer = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5),
            nn.ReLU(),

            nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5),
            nn.ReLU(),

            nn.MaxPool2d(kernel_size=2, stride=2),

            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5),
            nn.ReLU(),

            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.fc_layer = nn.Sequential(
            nn.Linear(64*3*3, 100),
            nn.ReLU(),
            nn.Linear(100, 10)
        )

    def forward(self,x):
    	# self.layer에 정의한 연산 수행
        out = self.layer(x)
        # view 함수를 이용해 텐서의 형태를 [100,나머지]로 변환
        out = out.view(batch_size,-1)
        # print(batch_size, "1")
        # self.fc_layer 정의한 연산 수행    
        out = self.fc_layer(out)
        return out

Transfer Learning(전이학습)

말그대로, 전이(Transfer)라는 의미에 따라 비슷한 한 분야의 문제를 해결하기 위해 사전에 학습된 모델(Pre-trained Model)를 이용해 다른 문제에 적용시켜보는 것을 말합니다. 그런 후, 마지막 FCL 부분만 커스터마이징 하는 것을 말합니다.

대표적인 사전 학습 모델로 AlexNet이 발표된 이후 VGG, GoogleNet, ResNet 등 사용하고 있습니다.

 

FAIR(Facebook AI Research)에 따르면 기본적으로 학습한 모델 보다 사전 모델을 이용한 것이 2~3배 빠른 속도를 낸다는 것이 논문을 통해 밝혀졌습니다. 

Rethinking ImageNet Pre-training

 

 


☕️ 포스팅이 도움이 되었던 자료

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.