pytorch

[pytorch] 1. 모델 정의 (nn.Module / nn.Sequential)

독립성이 강한 ISFP 2023. 3. 22. 23:24
728x90
반응형

파이토치에서 모델을 정의하기 위해서는 모듈을 상속한 클래스를 사용합니다.

  • 계층(Layer) : 모듈 또는 모듈을 구성하는 한 개의 계층 (합성곱층 convolutional layer, 선형계층 Linear layer)
  • 모듈(module) : 한 개 이상의 계층이 모여서 구성된 것. 모듈이 모여 새로운 모듈을 만들 수도 있습니다.
  • 모델(model) : 최종적으로 원하는 네트워크로, 한 개의 모듈이 모델이 될 수도 있습니다.

1. nn.Module을 상속받지 않고 정의하는 방법

매우 단순한 모델을 만들 때 사용합니다. 구현이 쉽고 단순하다는 장점이 있습니다.

model = nn.Linear(in_features = 1, out_features = 1, bias = True)

2. nn.Module을 상속하여 정의하는 방법

파이토치에서 nn.Module을 상속받는 모델은 기본적으로 __init__() 과 forward() 함수를 포함합니다.

  • __init__() : 모델에서 사용된 모듈(nn.linear, nn.Conv2d), 활성화 함수 등을 정의
  • forward() : 모델에서 실행되어야 하는 연산을 정의
class MLP(Module):
    def __init__(self, inputs):
        super(MLP, self).__init__()
        self.layer = Linear(inputs, 1) # 계층 정의
        self.activation = Sigmoid()    # 활성화 함수 정의
    
    def forward(self, X):
        X = self.layer(X)
        X = self.activation(X)
        return X

3. Sequential을 사용하여 신경망을 정의하는 방법

nn.sequentail을 사용하면 __init__()에서 사용할 네트워크 모델들을 정의해 줄 뿐만 아니라 forward() 함수에서는 모델에서 실행되어야 할 계산을 좀 더 가독성이 뛰어나게 코드로 작성할 수 있습니다. 또한, Sequential 객체는 그 안에 포함된 각 모듈을 순차적으로 실행해 줍니다.

 

import torch.nn as nn

class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=5),
            nn.ReLU(inplace = True),
            nn.MaxPool2d(2))
        
        self.layer2 = nn.Sequential(
            nn.Conv2d(in_channels=64, out_channels=30, kernel_size=5),
            nn.ReLU(inplace = True),
            nn.MaxPool2d(2))
        
        self.layer3 = nn.Sequential(
            nn.Linear(in_features=30*5*5, out_features=10, bias=True),
            nn.ReLU(inplace = True))
        
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = x.view(x.shape[0], -1)
        x = self.layer3(x)
        return
model = MLP()
print(list(model.children()))
print(list(model.modules()))

 

model.children() 의 결과
model.modules() 의 결과

4. 함수를 사용하여 신경망을 정의하는 방법

Sequentail을 이용하는 것과 동일하지만, 함수로 선언할 경우 변수에 저장해 놓은 계층들을 재사용할 수 있는 장점이 있습니다. 하지만 모델이 복잡해지는 단점도 있습니다.

def MLP(in_features = 1, hidden_features = 20, out_features = 1):
	hidden = nn.Linear(in_features = in_features, out_features = hidden_features, bias = True)
    
    activation = nn.ReLU()
    
    output = nn.Linear(in_features = hidden_features, out_features = out_features, bias = True)
    
    net = nn.Sequential(hidden, activation, output)
    
    return net
728x90
반응형