ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #8. 합성곱 신경망(Convolutional neural network, CNN)
    인공지능/케라스 창시자에게 배우는 딥러닝 2021. 2. 22. 00:14
    반응형

     

    합성곱 신경망(Convolutional Neural Network)은 인공지능의 눈을 담당하는 신경망이라 할 수 있다. 정확히는 컴퓨터 비전을 위한 신경망이 합성곱 신경망이며, 흔히 이야기하는 CNN이다. 이번 포스팅에서는  MNIST 데이터에 Conv2D를 활용하여 CNN에 대한 기본적인 흐름을 파악한다. 먼저 기본 코드를 살펴보자.

    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) # 이미지 포맷
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))

    위의 코드를 보면 이전에 사용하던 Dense의 자리에 Conv2D와 MaxPooling2D가 있는 것을 볼 수 있다. MNIST 데이터를 합성곱 연산과 최대 풀링 연산을 통해 분석하는 모델이다.

    이 Conv2D 네트워크는 완전 연결 네트워크(Fully Connected)와 명확한 차이를 보인다. 이전의 완전 연결 네트워크는 각각의 영역이 가진 패턴을 별개의 것으로 본 반면,  Conv2D의 경우 한 데이터의 영역이라면 모든 영역의 데이터가 같다는 평행 이동 불변성(translation invariant)이라는 성질을 지녀 적은 수의 훈련으로 일반화가 가능하다. 또한 Conv2D의 경우 한 합성곱 층을 거친 데이터를 기반으로 다시 합성곱 층을 통과하기에 첫번째 층의 특성으로 구성된 더 큰 패턴을 학습하게 된다. 이러한 방식으로 Conv2D는 공간적 계층 구조를 학습할 수 있다.

     

    model.add(layers.Conv2D(64, (3, 3), activation='relu'))

    이 합성곱은 입력으로부터 뽑아낼 패치의 크기, 특성 맵의 출력 깊이를 파라미터로 가진다. 입력으로부터 뽑아낼 패치의 크기란 위에서 말한 영역 즉, 윈도우를 의미한다. 특성 맵의 출력 깊이는 이 영역을 통해 계산할 필터의 수를 의미한다. 데이터를 윈도우가 지나며 패치를 추출하고 이 패치를 1D 벡터로 변환하는 작업이 반복되면서 합성곱이 작동한다. 

     

    입력 데이터와 출력 데이터의 크기를 동일하게 맞추고 싶은 경우 패딩(padding)을 활용하여 행과 열에 0으로 값을 채운다. 윈도우를 한칸이 아닌 여러칸 지나가게 하기 위해서는 스트라이드(stride)를 활용할 수 있다. 

     

    이 다음으로 볼 것은 최대 풀링 연산(MaxPooling2D)이다. 최대 풀링 연산은 윈도우에서 각 채널별 최댓값을 그 윈도우의 값으로 설정하고 전체 맵의 크기를 줄인다. 최대 풀링 연산을 사용하지 않을 경우 최종 특성 맵은 필요 이상으로 많은 원소를 갖게 된다. 또한 점점 큰 윈도우를 통해 데이터를 처리하는 공간적 계층 구조를 형성하는데도 최대 풀링 연산은 필요하다.

    참조 코드 : github.com/Cluster-Taek/MachineLearningStudio/tree/master/DeepLearing/Conv2D

    반응형
Designed by Tistory.