CNN(합성곱 신경망)

9196 단어 딥러닝딥러닝

CNN : Convolutional Neural Networks(합성곱 신경망)

1. Convolution & Pooling

  • 컨볼루션은 한 함수가 다른 함수를 수정하는 방법을 보여주는 세 번째 함수를 생성하는 두 함수에 대한 연산
  • 컨볼루션에는 교환 성, 연관성, 분배 성 등 다양한 수학적 속성이 있다
  • 컨볼루션을 적용하면 입력의 모양(shape)이 효과적으로 변환된다

1D-convolution

2D-convolution

  • Filter : 가중치 (weights parameters)의 집합으로 이루어져 가장 작은 특징을 잡아내는 창
  • Stride : 필터(filter)를 얼만큼씩 움직이며 이미지를 볼 지 결정하는 수
    ex) Stride가 1이면 한칸씩 이동하며 stride가 2 이면 한칸씩 건너뛰면서 Filter를 적용하게 되고 띈 만큼 다음 레이어의 데이터의 수가 줄어든다
  • Padding : Zeros(또는 다른 값)을 이미지의 외각(가장자리)에 배치하여 conv를 할 때 원래 이미지와 같은 데이터의 수를 갖을 수 있도록 도와줌 (Stride = 1일 때) zero-padding은 크기조절과 데이터를 충분히 활용하기 위해 가장자리에 0을 더해준 것
  • Pooling layer : 피처맵의 차원을 줄인다 이렇게 줄어든 피쳐들을 이용하여 ANN형태의 신경망에 넣어 Classification or Regression을 수행하게 된다
  • 장점
    local Feature : 지역적 특징을 잡아 냄
    weight sharing
    translation invariance : 어느정도 움직임이 있더라도 해석이 큰 무리가 없다.

2. CNN 분류기

  • CNN의 첫번째 단계 covolution
    입력 이미지의 영역을 수신을 담당하는 뉴런에 매핑하는 변환

  • 장점 : 이전 이미지 학습 기술에 비해 이미지 전처리(자르기, 센터링, 정규화)가 상대적으로 거의 필요하지 않다 / 이미지의 모든 종류의 일반적인 문제(이동, 조명 등)에 대해 견고하다

model = Sequential() 
model.add(Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

model.summary()

summary 출력'''
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 30, 30, 32)        896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 4, 4, 64)          36928     
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
dense (Dense)                (None, 64)                65600     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 122,570
Trainable params: 122,570
Non-trainable params: 0
'''
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
              
model.fit(train_images, train_labels, epochs=10,
		validation_data=(test_images, test_labels))

3. 전이 학습(Transfer Learning)

  • 기존 데이터로 학습된 네트워크를 재사용 가능하도록 하는 라이브러리
    학습되었다는 것은 가중치와 편향이 포함된 학습된 모델의 일부를 재사용하기에 transfer learning이라고 표현한다
  • 일부만 사용할수도 전체를 재학습할 수도 있다
  • 교육 데이터를 적게 사용하고 교육 속도가 빠르며 더 잘 일반화하는 모델을 가질 수 있다

방법

  1. 이전에 학습한 모델에서 파라미터를 포함한 레이어를 가져온다
  2. 향후 교육 과정 중에 포함된 정보가 손상되지 않도록 해당 정보를 동결(freeze, 가중치를 업데이트 하지 않음)한다
  3. 동결된 층 위에 새로운 층 (학습 가능한 층)을 더한다
    • 출력층(output)의 수를 조절하여 새로운 데이터셋에서 원하는 예측방법(분류, 회귀 등)으로 전환하는 방법을 배울 수 있게된다
  4. 새로운 데이터셋에서 새로 추가한 계층만을 학습한다
    • 만약 기존 레이어를 동결하지 않으면, 학습된 레이어에서 가져온 weight까지 학습하게 된다
    • 위 경우 학습할 것이 많아지므로 시간이 오래걸린다

좋은 웹페이지 즐겨찾기