관리 메뉴

ComputerVision Jack

[케라스 Chapter5 정리] 본문

DeepLearning/케라스 - Keras Lib

[케라스 Chapter5 정리]

JackYoon 2020. 1. 31. 01:28
반응형

합성곱 신경망(convolutional neural network) = 컨브넷

CNN 딥러닝 모델 대부분은 컴퓨터 비전(Computer Vision) 애플리케이션에 사용된다.

합성곱 신경망 소개

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'))

#conv2D와 MaxPooling2D층을 쌓아 올린 네트워크이다.

 

컨브넷 입력에는 3차원 텐서를 사용한다.

(image_height, image_width, image_channel)

mnist 자료형 경우 shape(28, 28, 1)이 입력 텐서로 들어가게 된다.

 

model.add(layers.Flatten())

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

model.add(layers.Dense(10, activation = 'softmax'))

#마지막은 softmax를 이용해 분류를 한다.

따라서 입력에 1D를 사용하기 때문에 3D로 컨브넷에서 출력된 텐서를 flatten시켜서 입력으로 넣어야한다.

 

완전 연결 네트워크보다 컨브넷은 더 정확한 정확도를 얻는다.

 

합성곱 연산

완전 연결 층 : mnist 영상을 통으로 입력으로 사용한다. 

합성 곱 층 : 지역 패턴(지역 특징점)을 학습한다. 

                영상에서 마스크를 이용해 패턴을 추출한다.

 

  • 학습된 패턴은 평행 이동 불변성을 갖는다.
  • 컨브넷은 패턴의 공간적 계층 구조를 학습 할 수 있다.

합성곱 연산은 입력 특성 맵에서 작은 패치들을 추출하고, 모든 패치에 같은 변환을 적용하여

출력 특성 맵을 만든다.

이렇게 되면 깊이를 나타내는 축은 컬러 채널이 아닌 필터(마스크)수를 지칭한다.

 

#Mnist 자료형 경우 (28, 28, 1)크기의 특성맵(원본 이미지)를 입력 받아 (26, 26, 32) 크기의 특성 맵을 출력한다.

(26, 26, 32) 경우 가로 26, 세로 26, 32개의 마스크를 추출한다고 생각하면 된다.

 

합성곱 핵심 파라미터

  • 입력으로 뽑아낼 마스크 크기 : 전체적으로 3x3 5x5 마스크를 이용하여 특징을 추출한다.
  • 특성 맵 출력 깊이 : 합성곱으로 계산할 필터 수. 

즉 원본 영상에 대하여, 마스크가 슬라이딩 하면서 모든 위치에서 3D특성 패치를 추출하는 방식으로 합성곱이 동작한다.

마지막 3D는 합성곱 커널에 의해 1D로 변환된다.(Flatten)

 

또한 마스크가 원본 영상을 슬라이싱 하는 과정에 있어서 외각선 처리에 의해 영상에 손실이 올 수 있습니다.

  • 패딩을 추가하여 외각선에 대한 마스크 처리를 대응한다
  • 스트라이드의 사용여부에 따라 달라진다.

패딩(padding)

입력 영상 손실(마스크 슬라이싱중 외각선에 의해 발생)에 대응하기 위한 방법

valid : 패딩 사용하지 않음

same : 패딩을 사용함  - 입력과 동일한 출력 특성맵을 얻을 수 있다.

 

스트라이드(Stride)

두 번의 연속적인 윈도우 사이의 거리

기본값은 1이다. 마스크가 슬라이딩 할 거리를 지칭한다.

만약 스트라디으 크기가 2이면 2의 배수로 영상이 다운 샘플링 된것을 뜻한다.

 

하지만 다운 샘플하기 위해 스트라이드 대신 최대 풀링(max pooling)연산을 더 많이 사용한다.

 

최대 풀링 연산

특성 맵이 (26, 26)인데 맥스 풀링을 지나면 (13, 13)으로 바뀐다.

스트라이드와 비슷하게 강제적으로 영상을 다운샘플링한다.

 

입력 특성에서 마스크를 이용하여 슬라이딩 하며 마스크에서 최대 값을 출력한다.

최대 풀링 :  2x2 마스크 , 스트라이드 크기 2

합성곱 : 3 x 3 마스크, 스트라이드 1

 

다운 샘플링 하는 이유는 입력 영상에 대해 가중치 개수를 줄이기 위해 사용된다.

또한 필터의 공간적인 계층 구조를 구성한다.

소규모 데이터셋 컨브넷

from google.colab import drive

drive.mount('/content/drive')

 

!ls -ltr

cd drive

#코렙과 드라이브를 연동하고 cd를 통하여 dataset이 있는 폴터까지 디렉토리를 접근한다.

 

입력 (150, 150,) 영상을 (7, 7)로 만들고 flatten하여 sigmoid에 넣어 개와 고양이를 분류하는 모델을 만든다.

RMSprop 옵티마이저를 선택한다.

model = models.Sequential()

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))

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(128, (3, 3), activation='relu'))

model.add(layers.MaxPooling2D((2, 2)))

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

model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Flatten())

model.add(layers.Dense(512, activation='relu'))

model.add(layers.Dense(1, activation='sigmoid'))

#컨브넷 구축

훈련/검증 정확도와 손실

모델이 과적합에 직면하게 된다.

과적합을 해결하기 위해 드롭아웃을 적용하고 데이터를 증식한다.

데이터 증식하기

이미지 데이터 증식은 이미지를 회전하거나 이미지에 약간의 조작을 가해 데이터를 뿔린다.

model = models.Sequential()

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

                        input_shape=(150, 150, 3)))

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(128, (3, 3), activation='relu'))

model.add(layers.MaxPooling2D((2, 2)))

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

model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Flatten())

model.add(layers.Dropout(0.5))

model.add(layers.Dense(512, activation='relu'))

model.add(layers.Dense(1, activation='sigmoid'))

#드롭 아웃과 데이터 증식을 사용하여 다시 모델을 설계한다.

 

model.save('/content/drive/My Drive/Colab Notebooks/Keras_creator/model/cats_and_dogs_small_2.h5')

#사용한 모델을 저장한다.

과적합 방지를 적용후 훈련/검증 정확도와 손실

사전에 훈련된 컨브넷 사용하기

VGG16 : ImageNet 데이터셋에 널리 사용되는 컨브넷 구조

 

사전 훈련된 네트워크 사용방법

  • 특성 추출(feature extraction)
  • 미세 조정(fine tuning)

특성 추출

학습된 네트워크의 표현을 이용하여 새로운 데이터에서 특성을 뽑아내는 작업

 

컨브넷 : 훈련된 합성곱 기반 층 + 훈련된 분류기

특성 추출을 이용하여 새로운 분류기를 만들어 입력데이터를 넣어 배출한다.

완전 연결 분류기보다 합성곱 분류기만 재사용이 가능.

 

conv_base = VGG16(weights='imagenet',

                  include_top=False,

                  input_shape=(150, 150, 3))

#VGG16 모델 제작

 

단순한 특성 추출 방식으로 학습한경우

훈련/검증 정확도와 손실

데이터 증식을 사용한 특성 추출

model = models.Sequential()

model.add(conv_base)

model.add(layers.Flatten())

model.add(layers.Dense(256, activation='relu'))

model.add(layers.Dense(1, activation='sigmoid'))

#모델에 다른 모델을 추가할 수 있다.

 

모델을 컴파일하고 훈련하기 전에 합성곱 기반 층을 동결한다. 

동결 : 훈련동안 가중치가 업데이트 되는 것을 막는다.

 

변경사항을 적용하려면 모델을 먼저 컴파일 한번한다.

trainable속성을 변경하면 모델을 다시 컴파일해야 적용 변경점이 적용된다.

 

데이터 증식을 사용한 경우

훈련/검증 정확도와 손실

미세조정

특성 추출에 사용했던 동결 모델의 상위 층 몇개를 동결에서 해제하고 모델에 새로 추가한 층과 함께 훈련하는 것.

  • 사전에 훈련된 기반 네트워크 위에 새로운 네트워크 추가
  • 기반 네트워크 동결
  • 새로 추가한 네트워크 훈련
  • 기반 네트워크 일부 동결 해제
  • 동결해제 층과 추가한 층을 함께 훈련

conv_base.trainable = True

 

set_trainable = False

for layer in conv_base.layers:

    if layer.name == 'block5_conv1':

        set_trainable = True

    if set_trainable:

        layer.trainable = True

    else:

        layer.trainable = False

#예제에 대해 5번째 블록 미세조정 적용

 

미세 조정 적용한 경우

훈련/검증 정확도와 손실

불규칙한 그래프를 지수 이동 평균으로 부드럽게 표현

훈련/검증 정확도와 손실 변환

컨브넷 학습 시각화

  • 컨브넷 중간층의 출력 시각화
  • 컨브넷 필터 시각화
  • 클래스 활성화에 대한 히트맵 이미지 시각화

중간층 활성화 시각화

입력이 들어올때, 네트워크에 있는 여러 합성곱과 풀링 층이 출력하는 출력을 그리는 것.

특성맵 시각화

[테스트 사진]

고양이 테스트 사진

첫번째 층 (148, 148, 32)상황.

첫번째 층 활성화 중에서 20번째 채널.

20번째 채널

16번째 채널

16번째 채널
층에 대한 활성화 채널 예시

컨브넷 필터 시각화

각 필터가 반응하는 시각적 패턴을 그려보는 것.

빈 입력 이미지에서 특정 필터의 응답을 최대화 하기 위해 컨브넷 이미지에 경사 상승법을 적용한다.

 

VGG16 네트워크 block3_conv1층 필터 0번의 활성화를 손실로 정의한다.

0번째 채널이 최대로 반응하는 패턴

컨브넷의 각 층은 필터의 조합으로 입력을 표현할 수 있는 일련의 필터를 학습한다.

 

클래스 활성화의 히트맵 시각화

이미지의 어느 부분이 컨브넷의 최종 분류 결정에 기여하는지 이해하는데 유용

또는 이미지 특정 물체 위치 파악

 

특정 출력 클래스에 대해 입력 이미지의 모든 위치를 계산한 2D 점수 그리드

[테스트 데이터]

코끼리 예제

사진에 대해 VGG16 모델은 아프리카 코끼리라고 예측하였다.

그에 따른 활성 히트맵
활성 히트맵 적용

히트맵에 원본 이미지를 겹친 이미지

 

적용된 구현 방법 : Grad-CAM : Visual Explanations from Deep Networks via Gradient-based Localization

입력 이미지가 주어지면 합성곱 층에 있는 특성 맵의 출력을 추출한다.

특성 맵의 모든 채널 출력에 채널에 대한 클래스의 그래디언트 평균을 곱한다.

 

입력 이미지가 각 채널을 활성화 하는 정도에 대한 공간적인 맵을 클래스에 대한 각 채널의 중요도로 가중치를

부여하여 입력 이미지가 클래스를 활성화 화는 정도에 대한 공간적인 맵을 만드는 것.

05-1 합성곱 신경망 소개.ipynb
0.01MB
05-2 소규모 컨브넷.ipynb
0.42MB
5-3 사전 훈련된 컨브넷.ipynb
0.20MB
5-4 CNN 시각화.ipynb
1.93MB

반응형

'DeepLearning > 케라스 - Keras Lib' 카테고리의 다른 글

[케라스 Chapter7정리]  (0) 2020.02.18
[케라스 Chapter6 정리]  (0) 2020.02.11
[케라스 Chapter4 정리]  (0) 2020.01.28
[케라스 Chapter3 정리]  (0) 2020.01.15
[케라스 Chapter2 정리]  (0) 2020.01.14
Comments