간단한 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를 활용하면 모델의 전반적인 구조도를 확인할 수 있다.
완전연결층과 합성곱 사이에는 차이점이 존재한다.
완전연결층은 입력 특성 공간에 있는 전역 패턴을 학습하지만 합성곱층은 지역 패턴을 학습한다. 합성곱에서 핵심 피처(feature)는 두가지 특징을 제공하는데,
복잡하고 추상적인 개념을 공간적 계층 구조로 효과적 학습
합성곱 연산은 특성맵(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하는 과정까지 진행되겠다.
작은 이미지 데이터셋에 딥러닝을 적용하는 일반적이고 매우 효과적인 방법은 바로 사전 훈련된 모델을 사용하는 것이다. 이는 일반적으로 대규모 이미지 분류 문제를 위해 대량의 데이터셋에서 미리 훈련된 모델을 의미한다.
사전 훈련된 모델을 사용하는 방법은 크게 두가지가 존재한다(특성 추출
과 미세 조정
)
특성 추출
은 사전에 학습된 모델의 표현을 사용하여 새로운 샘플에서 흥미로운 특성을 뽑아내는 것이다. 이러한 특성을 사용하여 새로운 분류기를 처음부터 훈련한다.
여기서 합성곱층만 재사용하는 이유는, 합성곱 층에 의해 학습된 표현이 더 일반적이기 때문이다. 분류기에서 학습한 표현은 모델이 훈련된 클래스 집합에 특화되어 있기 때문에 일반적으로 객체 위치만을 고려한 합성곱층만 재사용한다.
미세 조정
은 특성 추출을 보완하는 과정으로, 특성 추출에서 사용했던 동결 모델의 상위 층 몇개를 동결에서 해제하고 모델에 새로 추가한 층과 함께 훈련하는 것이다. 주어진 문제에 조금 더 밀접하게 재사용 모델의 표현을 일부 조정하기 때문에 미세 조정이라고 부른다. 네트워크를 미세 조정하는 방법에 대해 확인해보자.
1. 사전에 훈련된 기반 네트워크 위에 새로운 네트워크를 추가한다.
2. 기반 네트워크를 동결한다.
3. 새로 추가한 네트워크를 훈련한다.
3. 기반 네트워크에서 일부 층의 동결을 해제한다.(이때, 배치 정규화 층은 동결 해제하면안된다.)
4. 동결을 해제한 층과 새로 추가한 층을 함께 훈련한다.
미세 조정을 할 때 고려해야하는 것은