딥러닝/Tensorflow

[Deep Learning / Tensorflow] Model Layer 분석 및 파라미터 계산 실습

bluetag_boy 2024. 3. 12. 14:46
반응형

실습 코드

import tensorflow as tf
from tensorflow import keras
from keras import layers

def get_sequential_model(input_shape): 
    model = keras.Sequential(
        [
            # Input
            layers.Input(input_shape),
            
            # 1st Conv block
            layers.Conv2D(64, 3, strides=1, activation='relu', padding='same'),
            layers.Conv2D(64, 3, strides=1, activation='relu', padding='same'),
            layers.MaxPool2D(), # 이미지 사이즈 반으로 축소
            layers.BatchNormalization(),
            layers.Dropout(0.5),
            
            # 2nd Conv block
            # 이미지 사이즈가 축소되었으면 필터사이즈를 키워주는게 일반적 / 64 -> 128
            layers.Conv2D(128, 3, strides=1, activation='relu', padding='same'),
            layers.Conv2D(128, 3, strides=1, activation='relu', padding='same'),
            layers.MaxPool2D(),
            layers.BatchNormalization(),
            layers.Dropout(0.3),           
            
            # Classifier
            layers.GlobalMaxPool2D(), # 한 필터에서 하나의 값만 가져오게 함
            layers.Dense(128, activation='relu'),
            layers.Dense(1, activation='sigmoid')
        ]
    )
    
    return model
    

input_shape = (256, 256, 3)
model = get_sequential_model(input_shape)

model.summary()
  • filters: 몇 개의 다른 종류의 필터를 활용할 것인지를 나타냄. 출력 모양의 깊이(depth)를 결정
  • kernel_size: 연산을 수행할 때 윈도우의 크기를 의미
  • strides: 윈도우가 가로 그리고 세로로 움직이면서 내적 연산을 수행하는데, 한 번에 얼마나 움직일지를 의미
  • padding: 이미지 사이즈를 방지하기 위해 사용되는 인자

 

 

Model Summary

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 256, 256, 64)      1792      
                                                                 
 conv2d_1 (Conv2D)           (None, 256, 256, 64)      36928     
                                                                 
 max_pooling2d (MaxPooling2D  (None, 128, 128, 64)     0         
 )                                                               
                                                                 
 batch_normalization (BatchN  (None, 128, 128, 64)     256       
 ormalization)                                                   
                                                                 
 dropout (Dropout)           (None, 128, 128, 64)      0         
                                                                 
 conv2d_2 (Conv2D)           (None, 128, 128, 128)     73856     
                                                                 
 conv2d_3 (Conv2D)           (None, 128, 128, 128)     147584    
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 64, 64, 128)      0         
 2D)                                                             
                                                                 
 batch_normalization_1 (Batc  (None, 64, 64, 128)      512       
 hNormalization)                                                 
                                                                 
 dropout_1 (Dropout)         (None, 64, 64, 128)       0         
                                                                 
 global_max_pooling2d (Globa  (None, 128)              0         
 lMaxPooling2D)                                                  
                                                                 
 dense (Dense)               (None, 128)               16512     
                                                                 
 dense_1 (Dense)             (None, 1)                 129       
                                                                 
=================================================================
Total params: 277,569
Trainable params: 277,185
Non-trainable params: 384

 

 

1) Conv2D Layer

 컨볼루션 레이어의 파라미터 수는 필터의 크기, 입력 채널의 수, 그리고 필터의 수에 의해 결정된다. 파라미터수는 다음과 같은 공식으로 계산된다. 이때,  입력 채널 수는 입력 이미지의 채널 수에 따라 달라진다.

 

파라미터 수 = (필터 높이 × 필터 너비 × 입력 채널 수) × 필터 수 + 편향 값

 

파라미터 계산

  • conv2d : kernel_size = 3, Input_channel = 3(RGB), filters = 64, bias = 64
  • conv2d_1 : kernel_size = 3, Input_channel = 64, filters = 64, bias = 64
  • conv2d_2 : kernel_size = 3, Input_channel = 64, filters = 128, bias = 128
  • conv2d_3 : kernel_size = 3, Input_channel = 128, filters = 128, bias = 128
conv2d (Conv2D)             (None, 256, 256, 64)      (3x3x3) x 64 + 64 = 1792
                                                                 
conv2d_1 (Conv2D)           (None, 256, 256, 64)      (3x3x64) x 64 + 64 = 36928   
 
conv2d_2 (Conv2D)           (None, 128, 128, 128)     (3x3x64) x 128 + 128 = 73856     
                                                                 
conv2d_3 (Conv2D)           (None, 128, 128, 128)     (3x3x128) x 128 + 128 = 147584

 

 

2) BatchNormalization Layer

 배치 정규화 레이어의 파라미터 수는 정규화되는 특성(또는 채널)의 수에 의해 결정된다. 특성에 대해 평균과 분산을 조정하는 데 사용되는 스케일링 인자와 이동 인자가 있으므로, 파라미터 수는 두 배가 된다.

 

파라미터 수 = 특성 수 x 2

※ 특성 수 : 해당 층에 입력되는 데이터의 차원 또는 특성의 개수

 

파라미터 계산

# 학습 가능한 파라미터(γ와 β 각각 64개씩, 총 128개)와 이동 평균과 분산(각각 64개씩, 총 128개)을 모두 포함
batch_normalization (BatchNormalization)      (None, 128, 128, 64)     64 x 2 + 64 x 2 = 256	       

# 학습 가능한 파라미터(γ와 β 각각 128개씩, 총 256개)와 이동 평균과 분산(각각 128개씩, 총 256개)을 모두 포함
batch_normalization_1 (BatchNormalization)    (None, 64, 64, 128)      128 x 2 + 128 x 2 = 512

 

 

3) Dropout Layer

드롭아웃 층은 과적합을 방지하기 위해 사용된다. 훈련 중에 무작위로 노드의 일부(이 경우 약 50%)를 "끄는" 방식으로 작동한다. 이는 네트워크가 입력 데이터의 작은 변화에 덜 민감하게 되도록 하여, 모델의 일반화 능력을 향상시킨다.

  • layers.Dropout(0.5)
  • layers.Dropout(0.3)
# 노드의 50% 사용x
dropout (Dropout)           (None, 128, 128, 64)      0         

# 노드의 30% 사용x
dropout_1 (Dropout)         (None, 64, 64, 128)       0

 

 

4) Dense Layer

 편향 값이 추가되는 방식은 Dense 층(완전 연결 층)에 의해 결정된다. Dense 층에서 각 노드는 입력 데이터의 모든 요소에 대해 가중치를 가지며, 추가적으로 자신만의 편향 값을 하나씩 갖는다. 따라서, 각 Dense 층의 파라미터 수는 입력 노드 수와 출력 노드 수를 기반으로 계산될 때, 출력 노드마다 하나의 편향을 추가하여 계산된다.

 

파라미터 계산

dense (Dense)               (None, 128)               128 x 128 + 128 = 16512     
                                                                 
dense_1 (Dense)             (None, 1)                 128 x 1 + 1 = 129

 

 

Total params

1792 + 36928 + 256 + 73856 + 147584 + 512 + 16512 + 129 = 277,569

 

 

Trainable params  = 277,185

 

 

Non-trinable params

batch_normalization layer 에서 이동 평균과 분산 파라미터는 학습에 사용되지 않으므로 제외된다.

64 x 2 + 128 x 2 = 384