본문 바로가기

AI & Big Data/AI

[AI 이론] Layer, 레이어의 종류와 역할, 그리고 그 이론 - 1 (Conv2D)

반응형

서  론

 

Tensorflow 2.X 버전이 발표되면서, 기존의 난립하고 있던 Frozen Graph나 여러 저장 방식이 통일되고,

개발자들의 불만이 많았던 Session이 사라지며,

 

무엇보다 Keras를 통합하며 tf.keras라는 새로운 방식이 나타났다.

 

실제로 EfficientNet 등의 최신 SOTA(State-of-the-Art) 모델의 소스코드를 보면,TF2.X대로 짜여진 소스 코드는 PyTorch의 코드와 매우 유사하다.

 

# PyTorch Source Code

class SomeLayer(torch.nn.Module):
    def __init__(self):
        super.__init__()
        # Some algorithm
    def forward(self):
        # Some algorithm

 

PyTorch의 모델 소스 코드가 위와 같다면,

 

# Tensorflow 2.x Source Code

class SomeLayer(tf.keras.layers.Layer):
    def __init__(self):
        super.__init__()
        # Some Algorithm
    def call(self):
        # Some Algorithm

 

TF2.X대 버전의 소스 코드는 위와 같기 때문이다.

실제로 객체를 생성할 때 __init__() 함수가 불러와지고,인스턴스를 호출할 때 call이나 forward 함수가 작동하는 방식으로,

 

둘 다 매우 파이써닉(Pythonic)한 문법이다.

 

그렇다면 Tensorflow와 PyTorch의 차이점이 무엇인가에 대한 호기심은 다음에 다뤄보도록 하고,

사실 오늘 다뤄볼 주제는 조금 더 원론(이론)에 가까운 주제로,

 

과연 Tensorflow와 PyTorch에서 다루는 레이어(Layer)란 무엇인가,그 종류는 무엇이 있고,각각의 레이어들은 어떤 역할을 하는가에 대한 논의이다.

 

조금은 간단하게,그러나 조금은 심도있게 알아보도록 하자.

 

이번 포스팅과 해당 넘버링을 지니는 후속 포스팅들에서는 자연어 처리나 시계열 학습 쪽이 아닌, 이미지 학습 및 이미지 분류에서 자주 사용되는 레이어에 대해 우선적으로 알아보도록 하겠다.


Conv2D Layer

Conv2D 레이어는 텐서플로우와 파이토치 양측에서 모두 지원하는 레이어로,

매우 기본적인 Convolution Layer다.

 

 

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

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

underflow101.tistory.com

이전 글에서도 소개되었지만,

기본적인 Convolution Product(컨벌루션곱, 합성곱)의 표시는 *로 나타내며, 수학적 공식은 아래와 같다.

합성곱 레이어, 즉 컨벌루션 레이어는 이러한 합성곱을 통해,

3차원의 이미지를 그대로 입력층에 받고, 출력 또한 3차원 데이터로 출력하여 다음 Layer로 전달하는 방식으로, 형상을 가지는 데이터(例: 이미지)를 제대로 학습할 수 있게 된다.

 

이러한 컨벌루션 레이어는 PyTorch Official Doc에서 아래와 같은 식으로 표현된다.

PyTorch와 Tensorflow에서의 용례는 각각 아래와 같다.

 

# PyTorch

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0,
				dilation=1, groups=1, bias=True, padding_mode='zeros')

 

# Tensorflow 2.X

tf.keras.layers.Conv2D(
    filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
    dilation_rate=(1, 1), 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 기준으로,

  • stride 옵션은 cross-correlation의 stride를 제어한다.
  • padding 옵션은 각 dimmesion의 padding number of points를 위한 implicit zero-padding의 수를 제어한다.
  • dilation 옵션은 커널 포인트 간의 spacing을 제어한다.
  • groups 옵션은 input과 output 사이의 connection을 제어한다.

Input과 Ouput의 수학적 수식은 아래와 같다.

채택 가능한 변수는 아래와 같다.

즉, Conv2D 레이어는 매우 기본적인 합성곱층(컨벌루션 레이어)으로,

이미지에 대한 공간적 컨볼루션을 담당한다.

 

인풋으로는 이미지의 레이어를 받으며, 컨벌루션곱을 거쳐 아웃풋 텐서(tensor)를 만들어내는 컨벌루션 커널을 생성한다.

 

use_bias가 True일 경우, 편향 벡터(biased vector)를 만들어 아웃풋에 더한다.

 

Activation이 None이 아닐 경우, 지정된 Activation(RMSProp, sigmoid 등)이 아웃풋에 적용된다.

 

나머지 대체적인 Conv2D의 특성은 위 링크되어 있는 이전 포스팅에 설명되어 있는 것과 동일하다.즉, 컨벌루션곱 레이어는 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 컨벌루션곱 레이어 뉴런의 수용영역 안에 있는 픽셀에만 연결이 되기 때문에, 저수준 특성 → 고수준 특성으로 조합해 나가며 원본 Input의 특성을 저장하게 된다.


다음 레이어는 다음 포스팅에 계속….


반응형