케라스 창시자에게 배우는 딥러닝_8장

코넬·2023년 2월 1일
0

DeepLearning_Keras

목록 보기
8/13
post-thumbnail

컴퓨터 비전을 위한 딥러닝

🔮 합성곱 신경망 소개

간단한 CNN 구조를 함수형 API로 구현한 모델을 봅시다.

from tensorflow import keras
from tensorflow.keras import layers
inputs = keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)
x = layers.Flatten()(x)
outputs = layers.Dense(10, activation="softmax")(x)
model = keras.Model(inputs=inputs, outputs=outputs)

여기서 모델의 summary method를 출력해보면

Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 28, 28, 1)]       0         
                                                                 
 conv2d (Conv2D)             (None, 26, 26, 32)        320       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 13, 13, 32)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 11, 11, 64)        18496     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 5, 5, 64)         0         
 2D)                                                             
                                                                 
 conv2d_2 (Conv2D)           (None, 3, 3, 128)         73856     
                                                                 
 flatten (Flatten)           (None, 1152)              0         
                                                                 
 dense (Dense)               (None, 10)                11530     
                                                                 
=================================================================
Total params: 104,202
Trainable params: 104,202
Non-trainable params: 0
_________________________________________________________________

Conv2D와 MaxPooling2D의 층의 출력은 (height, weight, channels)크기의 랭크-3 텐서이고, 여기서 채널(층)의 수는 첫번째 매개변수에 의해 조절되는 것을 확인할 수 있다. 마지막으로 Conv2D층의 출력 크기는 (3,3,128)로 128개의 채널을 가진 3*3크기의 특성맵 이다. 이런식으로 summary method를 활용하면 모델의 전반적인 구조도를 확인할 수 있다.

1️⃣ 합성곱 연산

완전연결층과 합성곱 사이에는 차이점이 존재한다.
완전연결층입력 특성 공간에 있는 전역 패턴을 학습하지만 합성곱층지역 패턴을 학습한다. 합성곱에서 핵심 피처(feature)는 두가지 특징을 제공하는데,

  • 학습된 패턴은 평행 이동 불변성을 가진다. : 완전 연결 네트워크는 새로운 위치에 나타난 것은 새로운 패턴으로 학습해야하지만, 합성곱이 이미지의 오른쪽 아래 모서리에서 어떤 패턴을 학습했다면 다른 곳에서도 이 패턴을 인식할 수 있다. 이는 이미지를 효율적으로 처리하게 돕는다.
  • ConvNet은 패턴의 공간적 계층 구조를 학습할 수 있다. : 작은 지역패턴 학습 - 더 큰 패턴을 학습 복잡하고 추상적인 개념을 공간적 계층 구조로 효과적 학습

합성곱 연산은 특성맵(feature map)이라고 부르는 랭크-3 텐서에 적용된다. 텐서는 2개의 공간축(높이와 너비)과 깊이축(채널축)으로 구성된다.

첫번째 과정(합성곱 초입부)

예를 들어 RGB이미지는 3개의 컬러 채널을 가지므로 깊이 축의 차원이 3이된다.합성곱 연산은 입력 특성 맵에서 작은 패치들을 추출하고, 이런 모든 패치에 같은 변환을 적용하여 출력 특성 맵(output feature map)을 만든다.
이런 특성 맵이 만들어지면 RGB각각은 필터(filter)가 되고, 필터는 입력 데이터의 어떤 특성을 인코딩하는 역할을 갖는다.
여기서 합성곱의 핵심적인 2가지 파라미터는 입력으로부터 뽑아낼 패치의 크기 , 특성 맵 출력 깊이 가 된다. 이제부터 출력 특성 맵 변형 과정을 살펴보자.
1. 3D입력 특성 맵 위를 3*3 크기의 윈도우가 슬라이딩 하면서 모든 위치에서 3D 특성 패치를 추출하는 방식으로 합성곱이 작성된다.
2. 이런 3D패치는 합성곱 커널이라는 하나의 학습된 가중치 행렬과 텐서 곱셈을 통해 output_depth크기의 1D 벡터로 변환된다. 모든 변환된 벡터는 (height, width, output_path)크기의 3D 특성 맵으로 재구성된다. 이 과정에서 경계 문제패딩을 해결, 활용해야한다.

두번째 과정(합성곱 중반부)

최대 풀링 연산(MaxPooling) 을 진행해야한다. 최대 풀링은 이미지 크기를 절반으로 줄이는 연산으로 합성곱을 통해 얻은 특징의 위치 정보를 의도적으로 없애 오버피팅을 피하는 기법이다.
원리 : 입력 특성 맵에서 윈도우에 맞는 패치를 추출하고 각 채널별로 최댓값을 출력한다. 추출한 패치에 학습된 선형 변환을 적용하는 대신 하드코딩 된 최댓값 추출 연산을 사용한다.
다른 방법으로는 평균 풀링(average pooling) 이 있다. 이는 입력 패치의 채널별 평균값을 계산하여 변환한다.
그러나 최대 풀링이 더 잘 작동하는 편인데, 이는 특성이 특성 맵의 각 타일에서 어떤 패턴이나 개념의 존재 여부를 인코딩하는 경향이 있기 때문이다. 따라서 특성의 평균값보다 여러 특성 중 최댓값을 사용하는 것이 더 유용하다.

마지막 과정(합성곱 후반부)

모델을 구현하고 훈련시킨 뒤, test하는 과정까지 진행되겠다.

2️⃣ 실제로 ConvNet훈련해보기

사전 훈련된 모델 활용하기

작은 이미지 데이터셋에 딥러닝을 적용하는 일반적이고 매우 효과적인 방법은 바로 사전 훈련된 모델을 사용하는 것이다. 이는 일반적으로 대규모 이미지 분류 문제를 위해 대량의 데이터셋에서 미리 훈련된 모델을 의미한다.
사전 훈련된 모델을 사용하는 방법은 크게 두가지가 존재한다(특성 추출미세 조정)

⏺️ 특성 추출

특성 추출 은 사전에 학습된 모델의 표현을 사용하여 새로운 샘플에서 흥미로운 특성을 뽑아내는 것이다. 이러한 특성을 사용하여 새로운 분류기를 처음부터 훈련한다.
여기서 합성곱층만 재사용하는 이유는, 합성곱 층에 의해 학습된 표현이 더 일반적이기 때문이다. 분류기에서 학습한 표현은 모델이 훈련된 클래스 집합에 특화되어 있기 때문에 일반적으로 객체 위치만을 고려한 합성곱층만 재사용한다.

⏺️ 미세 조정

미세 조정 은 특성 추출을 보완하는 과정으로, 특성 추출에서 사용했던 동결 모델의 상위 층 몇개를 동결에서 해제하고 모델에 새로 추가한 층과 함께 훈련하는 것이다. 주어진 문제에 조금 더 밀접하게 재사용 모델의 표현을 일부 조정하기 때문에 미세 조정이라고 부른다. 네트워크를 미세 조정하는 방법에 대해 확인해보자.
1. 사전에 훈련된 기반 네트워크 위에 새로운 네트워크를 추가한다.
2. 기반 네트워크를 동결한다.
3. 새로 추가한 네트워크를 훈련한다.
3. 기반 네트워크에서 일부 층의 동결을 해제한다.(이때, 배치 정규화 층은 동결 해제하면안된다.)
4. 동결을 해제한 층과 새로 추가한 층을 함께 훈련한다.

미세 조정을 할 때 고려해야하는 것은

  • 상위층을 우선 고려하자. - 합성곱 기반 층에 있는 하위 층들은 좀 더 일반적이고 재사용 가능한 특성들을 인코딩한다. 반며에 상위층은 좀 더 특화된 특성을 인코딩하는데, 새로운 문제에 재활용하도록 수정이 필요한 것은 구체적인 특성이므로 이들을 미세조정하는 것이 유리하다. 하위층으로 갈수록 미세 조정에 대한 효과가 감소한다.
  • 파라미터 수 주의하기 - 훈련해야할 파라미터가 많을 수록 과대적합의 위험이 커진다. 작은 데이터셋으로 전부 훈련하려고 하면 매우 위험하기에, 합성곱 기반 층에서 최상위 2-3개의 층만 미세조정하는 것이 좋다.

출처 : 케라스 창시자에게 배우는 딥러닝(개정판)

profile
어서오세요.

0개의 댓글