저번 글에 이어서 쭉 가겠습니다.
사실 안드로이드 어플 하나 만들어서 Test Results 비교 결과도 같이 봐볼까 했는데, 파이썬 만으로는 딥러닝 탑재 어플 만들기에는 어느정도 한계가 있어서
그냥 parameter 측면에서 비교 하겠습니다.
def inception_module(x, filter_config):
(filters_1x1, filters_3x3_reduce, filters_3x3, filters_5x5_reduce, filters_5x5, filters_pool_proj) = filter_config
path1 = layers.Conv2D(filters_1x1, (1, 1), padding='same', activation='relu')(x)
path2 = layers.Conv2D(filters_3x3_reduce, (1, 1), padding='same', activation='relu')(x)
path2 = layers.Conv2D(filters_3x3, (3, 3), padding='same', activation='relu')(path2)
path3 = layers.Conv2D(filters_5x5_reduce, (1, 1), padding='same', activation='relu')(x)
path3 = layers.Conv2D(filters_5x5, (5, 5), padding='same', activation='relu')(path3)
path4 = layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(x)
path4 = layers.Conv2D(filters_pool_proj, (1, 1), padding='same', activation='relu')(path4)
return layers.concatenate([path1, path2, path3, path4], axis=-1)
input_shape = (28, 28, 3)
input_layer = layers.Input(shape=input_shape)
x = inception_module(input_layer, filter_config=(64, 96, 128, 16, 32, 32))
x = layers.MaxPooling2D(pool_size=(2, 2))(x)
x = layers.Flatten()(x)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(2, activation='softmax')(x)
이게 제가 짠 계층입니다.
TensorFlow 라이브러리를 사용했고, GoogleNet을 착안했습니다.
Conv계층과 Dense 계층 두가지 계층을 나눠서 parameter 계산을 해보도록 하겠습니다.
Conv계층
Conv 계층 parameter 계산은
parameter 수 = (Filter Height x Filter Width x input channel 개수 + 1) x Filter 개수
이런식으로 계산을 할 수 있습니다.
그러면 차근차근 계산을 해보자면...
path1: (1 x 1 x C_in + 1) x 64
path2: ((1 x 1 x C_in + 1) x 96) + ((3 x 3 x 96 + 1) x 128
path3: ((1 x 1 x C_in + 1) x 16) + ((5 x 5 x 16 + 1) x 32
path4: ((1 x 1 x C_in + 1) x 32
여기서 C_in은 입력 채널 수를 말하고, RGB 채널이기 때문에 3 입니다.
그래서 쭉 계산기 뚜들기며, 곱하기 더하기 반복하면 총 124384의 parameter가 나옵니다.
Dense계층
Dense 계층 parameter 계산식은
parameter = (입력 유닛 수 + 1) x 출력 유닛 수
이렇게 구성이 됩니다.
여기서 또 봐보면, 총 두개의 Dense 계층을 가지고 있는데,
Dense1: (Flatten 유닛 수 + 1) x 64
Dense2: (64 + 1) x 2
요런식으로 구성되게 됩니다.
총 위의 출력 계층이 64이어서 저렇게 넣고,
MaxPooling 계층에서 절반 사이즈로 줄어든다는 가정 하에, 28 x 28 크기의 이미지에서 14 x 14 사이즈로 reduce.
Flatten 하면 14 x 14 x 256 = 50176
그러므로,
Dense1: (50176 + 1) x 64
Dense2: 동일하게 (64 + 1) x 2
쭉 다 합하면,
124384 + (50177 x 64) + (65 x 2) = 3335842
총 parameter 값은 3335842이 됩니다.
저 논문에서는 YOLOv3-Tiny를 사용했는데, 이게 대략적으로 8.5백만 개의 parameter 값을 갖고 있다고 합니다.
parameter 측면에서는 매우 간소화 됐다고 할 수 있습니다.
Qualitative 적인 증명을 포함해서 좀 더 제대로된 증명을 하고 싶었는데,
현재 단계에서는 공부가 좀 부족해서 그런지 이런 체계적인 증명이 어려운 것 같습니다.
경량화 파트는 참 어려운 길이구나 싶으면서 이쪽 분야로 공부를 제대로 하고 싶다는 생각도 같이 듭니다.
다음에는 공부 더 해서 좀 더 제대로된 증명으로 찾아뵙겠습니다.
감사합니당 ~ 🦾