본문 바로가기

AI & Big Data/AI

[AI 이론] Layer, 레이어의 종류와 역할, 그리고 그 이론 - 7 (Dense, Fully Connected Layer)

반응형

Dense, Fully Connected Layer

가끔 Tensorflow로 작성된 모델을 보다보면,

모델의 클래스 맨 아래쪽에 아래와 같은 코드를 볼 수 있다.

 

# Tensorflow 2.X

class SomeModel(tf.keras.Model):
    def __init__(self):
        # Some Algorithm...
        self.conv = tf.keras.layers.Conv2D(...)
        self.bn = tf.keras.layers.BatchNormalization()
        self.fc = tf.keras.layers.Dense(...)
    
    def call(self):
        # Some Algorithm...

 

다른 것은 conv, bn 등, Conv2D에서 따오거나 BatchNormalization을 축약했거나 하는데,

왜 Dense Layer는 fc일까?

 

그 해답은 아래에 있다.

 

Dense Layer는 Fully Connected Layer, 완전연결 계층이라는 개념부터 시작했다.

그렇기에 Dense Layer의 역할 또한, Input과 Output을 모두 연결해주는 것이다.

만약, 입력 뉴런의 가중치가 4개이고, 출력 뉴런의 가중치가 8개라면 Dense Layer는 이를 4×8로 총 32개의 가중치를 만든다.

 

이전 글에서는 완전연결 계층의 문제점이라고 하면서,

완전연결 계층을 이용하여 이미지를 분류하면, 3차원(가로, 세로, 채널)인 이미지 데이터(30, 30, 1 [px])를 입력층(Input Layer)에 넣어주기 위해 3차원 → 1차원으로의 데이터 변환을 해야 했다.

 

(이전 글)

 

[딥러닝] 합성곱 신경망, CNN(Convolutional Neural Network) - 이론편

배 경 우리는 AI 시대에 살고 있다. 거의 모든 제품에는 어떤 인공지능이 들어가 있고 어떤 기능을 해서 어떻게 삶을 윤택하게 하는지에 대해 논하고 있다. 그 중 가장 대표적인 인공지능 알고리�

underflow101.tistory.com

이러한 완전연결 계층의 문제점은 데이터의 형상이 무시된다는 것인데, 특히, 공간적 구조, 예를 들어 공간적으로 가까운 픽셀은 값이 비슷하거나 RGB의 각 채널은 서로 밀접하게 관련이 되어 있다거나, 거리가 먼 픽셀끼리는 관련이 없는 등, 이러한 정보들이 3차원에서 1차원 데이터로 Shift 되는 순간 사라지는 문제가 있다고 했으면서,

 

왜 이미지 분류 레이어 중 Dense Layer(완전연결 계층)가 있는 것일까?

 

위 글에서 논한 완전연결 계층은, 초기 이미지 분류 시도에 있어 사용했던,

Input 이미지의 전체를 직렬화(Serialize) 후, 그 이미지 인풋을 그대로 Fully Connected Layer에서 학습해버리는 방식이었고, 그랬기 때문에 아래 4가지 문제점들이 생겼다.

 

1) Image가 고해상도가 될 경우 파라메터 수의 급증 
2) 공간적 특성, 즉 Spatial Feature가 직렬화로 인해 무시됨

3) Fully Connected Layer는 영상의 전체 관계(topology)를 고려하지 못하게 되어, 입력 데이터의 변형에 매우 취약

4) 변형에 취약한 Fully Connected Layer는 변형된 영상의 학습데이터를 굉장히 많이 요구하게 됨

 

하지만 현재 Tensorflow 2.X의 Dense Layer나, PyTorch의 torch.nn.Linear 함수는 해당 레이어가 오기 직전의 Input과 그 후의 Output만을 완전연결 계층으로 만든다.

 

즉, Conv2d로 Feature Map을 만들고, DepthwiseConv2d로 Spatial Feature를 뽑아내고, MaxPooling으로 차원을 감소시킨 후 마지막으로 Dense Layer를 사용하면 감소된 차원의 Feature Map들만 Input으로 하여 Output과 완전연결 계층을 생성하여, 더 효율적인 학습이 가능해진다.

 

그렇기에 Dense Layer는 보통 모델의 맨 마지막에 위치해있는 경우가 많다.


Tensorflow 2.X와 PyTorch에서의 용례

Tensorflow에서는 Dense 함수를 그대로 사용하면 된다.

 

# Tensorflow 2.X
# Dense Layer

tf.keras.layers.Dense(
    units, activation=None, use_bias=True, kernel_initializer='glorot_uniform',
    bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
    activity_regularizer=None, kernel_constraint=None, bias_constraint=None,
    **kwargs
)

 

PyTorch에는 Dense는 없고, Linear를 쓰면 된다.

 

# PyTorch
# Linear

torch.nn.Linear(in_features, out_features, bias=True)

 


다음 포스팅에 계속!


 

반응형