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

2023. 3. 22. 23:24·pytorch
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
반응형
저작자표시 (새창열림)

'pytorch' 카테고리의 다른 글

[pytorch] 3. 모델 학습 (파이토치 학습 절차)  (0) 2023.04.05
[pytorch] 2. 모델 파라미터(손실 함수/ 옵티마이저 / 학습률 스케줄러)  (0) 2023.04.04
[pytorch] tensor(텐서) 생성/이해/조작  (0) 2023.03.19
[pytorch] pytorch 특징 / pytorch 아키텍처 / pytorch 장점 / pytorch API 종류  (0) 2023.03.14
[pytorch] 딥러닝 학습 순서 / 딥러닝의 종류  (0) 2023.03.12
'pytorch' 카테고리의 다른 글
  • [pytorch] 3. 모델 학습 (파이토치 학습 절차)
  • [pytorch] 2. 모델 파라미터(손실 함수/ 옵티마이저 / 학습률 스케줄러)
  • [pytorch] tensor(텐서) 생성/이해/조작
  • [pytorch] pytorch 특징 / pytorch 아키텍처 / pytorch 장점 / pytorch API 종류
ISFP의 블로그
ISFP의 블로그
이건 첫 번째 레슨, 업무에서 마주친 문제 해결 경험 공유하기 이건 두 번째 레슨, 개인적으로 공부한 데이터/AI 지식을 기록하기 이건 세 번째 레슨, 다른 사람과 비교하지 말고 오직 어제의 나와 비교하기
  • ISFP의 블로그
    resultofeffort
    ISFP의 블로그
  • 전체
    오늘
    어제
    • 분류 전체보기 (117)
      • python (25)
      • pythonML (27)
      • Linux (0)
      • 오류Error (8)
      • information (7)
      • Deep learning (5)
      • pytorch (29)
      • 코딩테스트 (4)
      • 밑바닥 DL (4)
      • 논문 리뷰 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자연어처리
    Deep Learning
    티스토리챌린지
    텍스트전처리
    오블완
    딥러닝
    cnn
    토큰화
    인공지능
    deeplearning
    Ai
    머신러닝
    Pandas
    데이터분석
    nlp
    pytorch
    machinelearning
    konlpy
    분류
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
ISFP의 블로그
[pytorch] 1. 모델 정의 (nn.Module / nn.Sequential)
상단으로

티스토리툴바