Convolutional Neural Network (CNN)

monzheld·2022년 3월 10일
0

🗝 Keyword




📑 Concept


CNN(Convolutional Neural Network, 합성곱 신경망)

  • 다층 퍼셉트론 신경망(MLP)
    • 모든 입력 값을 Flatten으로 펴준 뒤에 연산
      -> 공간적 특성 살리지 X (공간 정보 소실)

  • CNN
    • 이미지 데이터의 공간적 특성 보존
    • 합성곱 층 - 이미지의 일부분을 훑으면서 연산 진행, 특징을 잡아내 학습
      => 층이 깊어지더라도 공간적 특성을 최대한 보존




CNN의 구조


이미지 출처

  • CNN 구조

    • 특징 추출 부분(Feature Extractor)
      • 합성곱 층(Convolution Layer)
      • 풀링 층(Pooling Layer)
    • 분류를 위한 신경망(Classifier)
      • 완전 연결 신경망(Fully Connected Layer)
      • 출력층(Output Layer)




특징 추출 부분(Feature Extractor)


합성곱(Convolution)

  • 합성곱 필터(Convolution Filter)슬라이딩(Sliding)하며 이미지 부분부분의 특징을 읽어나감

  • 필터왼쪽 위부터 오른쪽으로 슬라이딩하며 합성곱 진행

  • 결과값: Feature Map

  • 단점 -> output(=Feature Map)이 작아짐




필터(Filter)

  • 이미지의 특징을 찾아내기 위한 공용 파라미터

  • Kernel이라고도 함 (Filter = Kernel)

  • 일반적으로 (3, 3)이나 (5, 5)과 같은 정사각 행렬로 정의

  • 입력 데이터를 지정된 간격으로 순회하며 채널별로 합성곱을 하고 모든 채널(컬러의 경우 3개)의 합성곱의 합Feature Map으로 만듦
    => 지정된 간격으로 이동하면서 전체 입력데이터와 합성곱해 Feature Map 만듦

CNN 요약




패딩(Padding)

이미지 출처

  • 외부특정한 값으로 둘러싸서 처리해주는 방식

  • Output(=Feature map) 의 크기 조절, 실제 이미지 값을 충분히 활용하기 위해 사용

  • '0'으로 둘러싸주는 제로-패딩(Zero-Padding)이 가장 많이 사용됨

  • padding='valid' : no padding (패딩 적용X)

  • padding=’same' : results in padding with zeros evenly to the left/right or up/down of the input.
    입력의 왼쪽/오른쪽 또는 위/아래에 균일하게 0이 채워짐
    (=> 인풋과 아웃풋이 동일한 길이를 갖도록 0으로 패딩)

  • padding="same" and strides=1 -> output has the same size as the input.

tf.keras.layers.Conv2D | TensorFlow Core v2.8.0




스트라이드(Stride)

  • 필터가 이동하는 보폭(=간격)을 결정
    -> 슬라이딩(Sliding)시에 몇 칸 씩 건너뛸지

  • Stride=1
    -> 필터 1칸씩 이동

  • Stride=2
    -> 필터 2칸씩 이동


  • Stride = 1
  • Stride = 2
  • => Stride가 커질수록 출력되는 Feature map의 크기는 작아




필터 크기(Filter size), 패딩(Padding), 스트라이드(Stride)에 따른 Feature map 크기 변화



Nout=[Nin+2pks]+1N_{\text{out}} = \bigg[\frac{N_{\text{in}} + 2p - k}{s}\bigg] + 1

NinN_{\text{in}} : 입력되는 이미지의 크기(=피처 수)

NoutN_{\text{out}} : 출력되는 이미지의 크기(=피처 수)

kk : 합성곱에 사용되는 커널(=필터)의 크기

pp : 합성곱에 적용한 패딩 값

ss : 합성곱에 적용한 스트라이드 값




합성곱(Convolution) 계산 과정


Step 1)


Step 2) -> Stride = 1


Stride) -> Stride = 2


Padding)

Convolution Operation step




(A)에서 학습될 가중치의 개수
model = Sequential()
model.add(Conv2D(3, (5, 5), activation='relu', input_shape=(100, 100, 3))) # ---- (A)
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(5, activation='softmax'))

=> 225

  • Convolution 층에서 filter가 가중치
  • filer shape=(5,5) -> filter: 가중치 25개 (5x5)
  • filter 3개 적용 & input이 RGB라서 채널이 3개
    -> 25(filter 가중치) x 3(filter 3개) x 3(input 채널 3개)
    = 225개




풀링(Pooling)

  • 가로, 세로 방향의 공간을 줄이기 위해 사용

  • 풀링 층은 학습해야 할 가중치가 없어 채널 수가 변하지 않음


이미지 출처

  • 최대 풀링(Max pooling)

    • 정해진 범위 내에서 최대값 추출
  • 평균 풀링(Average pooling)

    • 정해진 범위 내에 있는 모든 요소의 평균 추출
  • 주로 풀링 사이즈랑 같은 값의 Stride 사용

    • ex) 풀링: 2 * 2 -> Stride=2
    • ex) 풀링: 3 * 3 -> Stride=3




분류를 위한 신경망(Classifier)


완전 연결 신경망(Fully Connected Layer)

  • 합성곱 층(Convolutional Layer), 풀링 층(Pooling Layer)에서 충분히 특징 추출 -> 완전 연결 신경망(Fully Connected Layer) 구축

  • 다층 퍼셉트론 신경망으로 구성

  • 풀어야 하는 문제에 따라 출력층을 잘 설계해주는 것이 중요




CNN의 학습

  • Convolution 층에 있는 Filter의 가중치를 학습



  • Convolution 층과 Pooling 층을 거치면서 이미지가 작아지고 Convolution 층의 Filter는 더 큰 특징을 포착
    • 낮은 층에서는 가로, 세로 등의 특징 학습
    • 층이 깊어지면서 물체의 일부 포착
    • 층이 더욱 깊어지게 되면 물체 전체의 윤곽에 해당하는 특징 학습




전이 학습(Transfer Learning)

"거인의 어깨에 올라서서 더 넓은 세상을 바라보라"

-> 이미 잘 정립된 지식을 바탕으로 하여 더 높은 곳에 이를 수 있었다


  • 사전 학습 모델(Pre-trained Model)
    • 대량의 데이터로 학습한 모델
    • 이미지 분류에서 사용되는 주요 사전 학습 모델
      • VGG
      • GoogLeNet(Inception)
      • ResNet

  • 전이 학습(Transfer Learning)
    • 대량의 데이터를 학습한 사전 학습 모델(Pre-trained Model)의 가중치를 그대로 가져와
      분류기(=완전 연결 신경망) 부분만 설계해서 사용
    • 사전 학습 가중치는 학습되지 않도록 고정(freeze) -> 학습 빠름, 더 좋은 결과
    • 사전 학습 가중치: 여러 데이터의 일반적인 특징을 많이 학습해서 어떠한 데이터를 넣더라도 준수한 성능을 보임




0개의 댓글