심층 학습 모델의 매개 변수 수를 계산합니다.

1. 소개



문득 딥 러닝의 파라미터는 어떻게 계산할 수 있을까 생각해, 이해를 확인하기 위해서도 계산해 보았습니다.

2. 모델 구성



Keras를 사용하여 모델을 구성해 봅니다.
이번에 작성하는 모델은 256x256의 RBG의 화상을 입력으로서 9개의 카테고리로 분류하는 모델이 됩니다.



구현



필요한 모듈을 가져옵니다.
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten, Dropout
from keras.layers.core import Dense

분류할 클래스 수를 상수로 정의하고,
num_class = 9

모델을 구성합니다.
# モデルの作成
model = Sequential()

model.add(Conv2D(32, kernel_size=3, padding="same", activation='relu', input_shape=(256, 256, 3)))
model.add(Conv2D(32, kernel_size=3, padding="valid", activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.5))

model.add(Conv2D(32, kernel_size=3, padding="same", activation='relu'))
model.add(Conv2D(32, kernel_size=3, padding="valid", activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(32, kernel_size=3, padding="same", activation='relu'))
model.add(Conv2D(32, kernel_size=3, padding="valid", activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())    #Flatten()により特徴マップをベクトルに変換
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_class, activation='softmax'))    #Softmax関数にて、9 クラスの確度として出力

모델 정보를 출력합니다.
model.summary()        # モデル情報の表示

다음과 같은 출력을 얻을 수 있습니다. 이 중에서 가장 오른쪽에 파라미터 수가 출력되고 있습니다. 이번 모델에서는 6,029,097개의 파라미터가 학습에 의해 조정됩니다.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 256, 256, 32)      896       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 254, 254, 32)      9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 84, 84, 32)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 84, 84, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 84, 84, 32)        9248      
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 82, 82, 32)        9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 41, 41, 32)        0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 41, 41, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 41, 41, 32)        9248      
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 39, 39, 32)        9248      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 19, 19, 32)        0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 19, 19, 32)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 11552)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               5915136   
_________________________________________________________________
dropout_4 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 128)               65664     
_________________________________________________________________
dropout_5 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 9)                 1161      
=================================================================
Total params: 6,029,097
Trainable params: 6,029,097
Non-trainable params: 0
_________________________________________________________________

3. 파라미터 수 계산



3-1. CNN 계층



먼저 첫 번째 레이어의 CNN 레이어를 살펴 보겠습니다. 필터수:32장, 필터 사이즈:3x3, 입력 채널:3(RGB), 출력 채널:3을 지정하고 있습니다.
model.add(Conv2D(32, kernel_size=3, padding="same", activation='relu', input_shape=(256, 256, 3)))
=================================================================
conv2d_1 (Conv2D)            (None, 256, 256, 32)      896       
_________________________________________________________________

파라미터 수는 다음 식으로 구할 수 있습니다.
파라미터 수 = 필터 세로 사이즈 x 필터 가로 사이즈 x 입력 채널 수 x 출력 채널 수 + 바이어스 x 출력 채널 수
param = 3 x 3 x 3 x 32 + 1 x 32 = 896

마찬가지로 두 번째 레이어도 계산해 보겠습니다.
model.add(Conv2D(32, kernel_size=3, padding="valid", activation='relu', input_shape=(256, 256, 3)))
=================================================================
conv2d_2 (Conv2D)            (None, 254, 254, 32)      9248      
_________________________________________________________________

이번에는 제 2 레이어에 대한 입력이 32 채널이므로,

파라미터 수 = 필터 세로 사이즈 x 필터 가로 사이즈 x 입력 채널 수 x 출력 채널 수 + 바이어스 x 출력 채널 수
param = 3 x 3 x 32 x 32 + 1 x 32 = 9248

제3,4,5,6의 Conv2D 레이어도 마찬가지로 계산할 수 있습니다.

3-2. Flatten 레이어



특징 맵을 벡터화하고 있습니다. 1 차원으로 떨어지고 있습니다. 여기에서는 학습에 의해 조정하는 파라미터는 아니지만,
_________________________________________________________________
dropout_3 (Dropout)          (None, 19, 19, 32)        0         
_________________________________________________________________

보다 벡터 차원은 19 x 19 x 32 = 11552입니다.

3-3. Dense층(숨겨진 층)



특징량을 벡터화하는 Flatten 레이어의 다음 Dense 레이어에서
파라미터 수 = 입력 사이즈 x 출력 사이즈 + 바이어스가되기 때문에
param = 11552 x 512 + 512 = 5915136

그 다음 숨겨진 층도 마찬가지로
dense_2 (Dense) param = 512 x 128 + 512 = 65664
dense_3 (Dense) param = 128 x 9 + 9 = 1161

4. 정리



새로 만든 모델을 확인합니다.
가장 오른쪽 Param의 값을 더하면 6,029,097입니다. 학습에서는 이 매개변수가 조정됩니다.
그리고 학습에 의해 조정된 파라미터가 모델의 일부가 되어, 추론에 있어서는, 모델을 경량화 등하지 않는 한, 이러한 파라미터가 사용되어 계산되고 있습니다.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 256, 256, 32)      896       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 254, 254, 32)      9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 84, 84, 32)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 84, 84, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 84, 84, 32)        9248      
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 82, 82, 32)        9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 41, 41, 32)        0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 41, 41, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 41, 41, 32)        9248      
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 39, 39, 32)        9248      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 19, 19, 32)        0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 19, 19, 32)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 11552)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               5915136   
_________________________________________________________________
dropout_4 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 128)               65664     
_________________________________________________________________
dropout_5 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 9)                 1161      
=================================================================
Total params: 6,029,097
Trainable params: 6,029,097
Non-trainable params: 0
_________________________________________________________________

좋은 웹페이지 즐겨찾기