본문 바로가기

인공지능/DeepLearning

[PyTorch] Layers and Blocks

딥러닝이 우수한 중요 요소 중에 하나는 우수한 소프트웨어이다.

크기가 작은 MLP의 경우 모든 layer를 설계하여 직접적으로 구성할 수 있다.

하지만 컴퓨터 비전 문제를 풀기 위해 제안된 ResNet-152처럼 152개의 많은 layer들을 설계하기에는 번거로울 수 있다.

 

깊은 네트워크는 수많은 반복되는 형태를 가지고 있고,  반복되는 형태를 블록으로 구현하여 구성한다.

이렇게 구현한 블록들은 더 복잡한 네트워크 디자인을 구성하는 기본 요소가 된다.

 

아주 간단한 MLP 네트워크를 구현한다.

다음은 256개 유닛과 ReLU 함수의 hidden Layer와 10개 유닛의 output Layer로 구성된 네트워크를 생성하는 코드이다.

import torch
from torch import nn
from torch.nn import functional as F

net = nn.Sequential(
    nn.Linear(20, 256),
    nn.ReLU(),
    nn.Linear(256, 10)
)

X = torch.rand(2, 20)
print(net(X))

nn.Sequential에 구성되는 레이어를 순서대로 추가하여 처리되도록 네트워크 블록을 구성하였다.

 

Custom Block

블록이 작동하는 방식에 가장 쉬운 방법은 블록을 직접 구현하는 것이다.

다음은 MLP를 256개 유닛의 hidden Layer와 10개 유닛의 output Layer의 네트워크를 생성하는 클래스 코드이다.

import torch
from torch import nn
from torch.nn import functional as F

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.hidden = nn.Linear(20, 256)
        self.out = nn.Linear(256, 10)
    def forward(self, X):
        x = self.hidden(X)
        x = F.relu(x)
        x = self.out(x)
        return x

X = torch.rand(2, 20)
net = MLP()
print(net(X))

def __init__를 통해 각각의 레이어를 인스턴스 화하여 self.(함수)에 할당하여 적용한다.

def forward에서는 def __init__에서 구현한 self.(함수)를 사용하여 순방향 네트워크를 구성한다.

 

또한 Block에 Block을 추가하거나 self.(함수)에 Block을 할당하여 사용할 수도 있다.

import torch
from torch import nn
from torch.nn import functional as F

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.hidden = nn.Linear(20, 256)
        self.custom = nn.Sequential(nn.Linear(256, 512), nn.ReLU(),
        							nn.Linear(512, 256))
        self.out = nn.Linear(256, 10)
    def forward(self, X):
        X = self.hidden(X)
        X = F.relu(X)
        X = self.custom(X)
        X = self.out(X)
        return X

X = torch.rand(2, 20)
net = nn.Sequential(MLP(), nn.Linear(10, 1), nn.Sigmoid())
print(net(X))

다양한 Custom 방식을 통해 창의적이고 효율적인 방법으로 블록을 조합하여 네트워크를 설계할 수 있다.

 

ref. Dive into Deep Learning, Aston Zhang and Zachary C. Lipton and Mu Li and Alexander J. Smola, 2020