케라스(keras) 코드를 활용해 MLP 파라미터 개수에 대해서 살펴보려고 한다.
모델을 만들자
먼저 아래처럼 간단한 분류 모델을 만들었다.
import tensorflow as tf
from sklearn.datasets import load_iris
import numpy as np
iris_data = load_iris()
x = iris_data['data']
y = iris_data['target']
print(x.shape)
print(np.unique(y))
[출력결과]
x는 4개의 feature 를 가지고 있는 150개(row)의 데이터이고, y는 3개의 label을 가지고 있다.
이를 학습/분류 하기 위해서 아래같은 간단한 MLP(Multi Layer Perceptron) 모델을 만들었다
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(32, input_dim=x.shape[1]),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(len(np.unique(y)), activation='softmax')])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x, y, epochs=100, validation_split=0.2)
[출력결과]
학습후 모델 평가를 해보니 84%의 정확도가 나왔다. (편의상 train/test/eval 데이터셋은 나누지 않았다)
파라미터 개수 확인해보자
오늘 살펴볼 부분인 파라미터 개수를 확인해보자
keras 에서는 summary() 함수를 통해서 모델의 정보를 확인할 수 있다 (layer 개수, parameter 개수 등)
맨 처음 dense_3(Dense) Layer를 보면 제일 오른쪽에 Param #이 160 이다. 왜 그럴까?
일단, 결론부터 말하면, input_dim=4 이고, layer의 노드 개수가 32 개이므로, 4X32 + 32 = 160 이다.
4X32 + 32 = 160에 대해서 좀 더 자세히 알아보자.
dense_3(Dense) Layer는 결국 4개의 데이터가 들어와서 32개의 데이터로 나가야 한다.
행렬 연산으로 설명하자면 이런 모습이다.
- (1 X 4) X (? X ?) = (1 X 32)
행렬곱셉 조건에 의해서 이것이 가능하려면 (? X ?) 이 (4 X 32) 되어야 한다. (자세한 내용은 행렬곱셉 참고)
이것이 4X32 + 32 = 160 에서, 앞쪽 4X32 이다.
그렇다면 뒤쪽 + 32 는 무엇일까? 바로 32개 노드에 더해지는 상수이다.
전체를 정리하면 정리하면, 다음과 같다
- (각 Layer의 파라미터 개수) = (input_dim X 노드수 + 노드수)
이를 위에 summary 결과에 적용해보면 값이 일치함을 확인할 수 있다.
- dense_4: 160 = 4 X 32 + 32
- dense_5: 528 = 32 X 16 + 16
- dense_6: 51 = 16 X 3 + 3
파라미터 개수와 모델 size의 관계
파라미터 개수별 모델 size를 확인해보자. (dense_3, dense_5 의 unit수를 조정하면서 결과를 비교해봤다)
사이즈를 계산하는 여러가지 방법이 있지만, 가장 직관적인 방법으로 모델을 파일로 저장하고, 해당 파일의 크기를 확인해봤다.
편의상 과정은 생략하고 결과만 정리하면 아래와 같다.
노드수 | dense_3: 16 dense_5: 8 |
dense_3: 32 dense_5: 16 |
dense_3: 64 dense_5: 32 |
파라미터 개수 | 243 | 739 | 2499 |
파일 사이즈(byte) | 36416 | 43128 | 63640 |
모델에는 파라미터 외에 다양한 정보가 저장되어 있기 때문에,
완벽하게 비례 하지는 않지만, 거의 정비례한다 (33000 + 13 byte * param)
'IT > Machine Learning' 카테고리의 다른 글
pytorch Classifier 튜토리얼 (feat. sklearn, digits, accuracy) (0) | 2023.06.15 |
---|---|
Ray tune 를 사용해서 pytorch hyperparameter 최적화하기 (feat. diabetes) (0) | 2023.06.14 |
Pytorch Linear/MLP Regression 튜토리얼 (feat. sklearn diabetes datasets) (0) | 2023.06.13 |
회귀모델 성능지표 결정계수란? (feat. 기준값, 음수, 조정된 결정계수) (2) | 2021.03.03 |
케라스(keras) 모델 저장(save) 및 불러오는(load) 2가지 방법 (0) | 2020.12.14 |