Deep Learning model output shape, parameter 개수 계산

gunny·2024년 4월 4일
0

Machine Learning

목록 보기
8/9

Instruction

가엽고 딱하게도 나는 어떤 태스크를 가지고 머신러닝 및 딥러닝 모델을 사용할 때, 가져다 쓰기만 했고, 어쨌든간 안에 있는 스트럭처를 제대로 이해해야 함을 은연중에 마음속에 품고만 있었다.
이번 텐서플로우 자격증 시험을 준비하면서 시계열 그래프 예측을 위한 딥러닝 모델을 쌓아감에 따라 내가 쌓은 모델의 summary()에서 나오는 output shape, param를 그냥 바라만 봤다가는 큰일 날 것 같았기에... 이번 기회에 deep learning model의 output shape와 parameter를 구하는 방법을 정리해보고자 한다.
텐서플로우 자격증 준비를 하다가 정리한 것으로 tensorflow 기준으로 작성합니다.

Deep learning model output shape 계산하기

[1] fully connected Dense layer

완전 연결(fully connected)된 각 입력에 대한 모든 가중치를 고려해서 출력을 생성하는 Dense layer의 경우

import tensorflow as tf

model = tf.keras.models.Sequential([
	tf.keras.layers.Dense(30, input_shape=[30], activation='relu',
    tf.keras.layers.Dense(10, activation='relu',
    tf.keras.layers.Dense(1)
    ])
    
model. summary()

[[output shape]]

위의 모델의 경우
첫 번째 레이어에는 input_shape = [30]
output_shape는 (None, 30)
activation = 'relu'

두 번째 레이어에는 input_shape = (None, 30)
output_shape는 (None, 10)
activation = 'relu'

세 번째 레이어에는 input_shape = (None, 10)
output_shape는 (None, 1)

이다. 입력 데이터를 30 차원의 벡터로 변환 후,
10차원의 벡터로 다시 변환하고 나머지 하나의 출력을 생성한다.

tf.keras.layers.Dense로 쌓은 레이어의 출력 형태는
입력 형태와 무관하게 units 매개변수에 의해 정해진다

처음 tf.keras.layers.Dense(units=30, input_shape=[30], activation='relu') 에서 input_shape의 숫자가 20, 40, 60, 1 등으로 변화해도 입력 형태의 길이는 상관없다. 해당 크기는 무시 되고 출력 차원은 units에 의해 결정된다.

즉, tf.keras.layers.Dense(units=50, input_shape=[30], activation='relu' 의 경우의 output shape는 (None, 50)이 될 것이다.

참고로 앞의 None은 batch size 이다.

[[paramter]]

Dense의 파라미터의 수는 가중치와 편향의 수를 합산한 것이다.
Dense 레이어의 가중치는 입력과 출력 사이의 연결, 편향은 각 출력 뉴런에 추가되는 상수다.
즉, 첫번째 Dense 레이어에서 입력 크기가 30이고 출력 크기가 30 이므로,
가중치 행렬의 크기는 (30,30) 으로 편향 벡터의 크기는 출력 크기인 30이다.
따라서 첫 번째 레이어의 파라미터 수는

파라미터 수 = 입력 크기 x 출력 크기 + 출력크기

로 30 * 30 + 30 = 930 이다.

두 번째 레이어의 경우는 입력 형태로 (None, 30)이 들어 왔고,
출력의 형태는 (None,10) 이므로
입력크기 (30 ) * 출력크기 (10) + 10 = 310이다.
로 30 * 10 + 10 이다.

세 번째 레이어의 경우 입력 형태로 (None, 10)이 들어오고, 출력의 형태는 (None, 1)이므로 파라미터의 개수는 10*1 + 1 = 11 이다.

[2] Convolution 1D layer

import tensorflow as tf

model = tf.keras.models.Sequential([
	tf.keras.layers.Conv1D(filters=64, kernel_size=3, strides=1,
    						padding='causal', input_shape=[30,1],
                            activation='relu')
                            ])

이 경우 Conv1D의 레이어는
입력 형태는 [30,1]
필터 수는 64,
커널 크기는 3 이다.

출력 형태는 (None, 30, 64)로 첫 번째 None은 배치 사이즈이다.
입력 형태가 [30,1] 이므로 입력 시퀀스의 길이는 30이다.
커널의 크기가 3이므로 커널이 입력 데이터를 스캔할 때 window가 3개의 값으로 구성된다.
출력 형태는 커널이 입력 데이터를 스캔하여 생성되는 각 창의 결과를 포함하는 시퀀스로, 이 시퀀스의 길이는 입력 시퀀스의 길이와 동일하게 유지된다.
출력 시퀀스의 길이는 입력 시퀀스의 길이인 30이 된다.
필터의 수가 64 이므로 각 창의 결과에 대해 64개의 값이 생성되는데 따라서 출력의 형태는 (None, 30, 64)이다.

Conv1D의 레이어의 출력형태는 입력 데이터의 형태와 레이어의 하이퍼 파라미터에 의 해 결정되는데, 입력 형태가 [30,1]에서 [30,3]으로 변해도, Conv1D는 각 시간 단계에서 특성마다 독립적인 필터를 적용해서 출력 형태는 변하지 않아. 여전히 (None, 30, 64)이다.

[[parameter]]

Conv1D의 파라미터 수는

  • 필터 파라미터 : 각 필터의 가중치는 필터 크기와 입력 채널 수에 의해 결정된다. 입력 채널 수는 입력 데이터의 마지막 차원의 크기로 현재 input_shape가 [30,1] 이었으므로, 입력 채널 수는 1이다.
    각 필터의 커널 크기에 해당하는 가중치가 3이 있으므로 각 필터의 가중치는 3이다.
  • 편향 파라미터 : 각 필터에 대한 편향이 추가되는데 각 필터마다 하나의 편향이 있어, 편향 파라미터수는 필터 수와 같다.

Conv1D의 파라미터 수 = 가중치 + 편향 * 필터수

즉 가중치 3 + 1 * 64 = 256이 된다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글