인공지능을 좋아하는 곧미남

torch.nn.Sequential 본문

code_study/pytorch

torch.nn.Sequential

곧미남 2022. 1. 14. 16:36

오늘은 딥러닝 아키텍쳐를 구현할때 여러 Layer를 순서대로 층을 구성할 수 있는 방법인

nn.Sequential 클래스에 관해 알아보겠습니다.

제가 준비한 내용은 아래와 같습니다.

 

< INDEX >

 

1. nn.Sequential의 목적

 

2. nn.Sequential의 사용방법

 

3. nn.Sequential에서 원하는 layer 불러오기.

 

4. 내용 고찰


1. nn.Sequential의 목적

     - Multi Layer 구성을 만들기 위해 사용


2. nn.Sequential의 사용방법

    - 코딩 시 표현법은 총 두 가지입니다. 

       1) layer마다 nn.Sequential Instance 부여하기

    self.layer1 = nn.Sequential(
        ConvLSTM(in_channels=num_channels, out_channels=num_kernels,
                kernel_size=kernel_size, padding=padding,
                activation=activation, frame_size=frame_size)
        nn.BatchNorm3d(num_features=num_kernels)
    )
    self.layer2 = nn.Sequential(
        ConvLSTM(in_channels=num_kernels, out_channels=num_kernels,
                kernel_size=kernel_size, padding=padding,
                activation=activation, frame_size=frame_size)
        nn.BatchNorm3d(num_features=num_kernels)
    )
    self.layer3 = nn.Sequential(
        ConvLSTM(in_channels=num_kernels, out_channels=num_kernels,
                kernel_size=kernel_size, padding=padding,
                activation=activation, frame_size=frame_size)
        nn.BatchNorm3d(num_features=num_kernels)
    )
    
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        
        return x

 

 

       2) sequential 객체 생성 후 .add_module() 메서드로 추가하기

        self.sequential = nn.Sequential()

        # Add First layer (Different in_channels than the rest)
        self.sequential.add_module(
            "convlstm1", ConvLSTM(
                in_channels=num_channels, out_channels=num_kernels,
                kernel_size=kernel_size, padding=padding,
                activation=activation, frame_size=frame_size)
        )

        self.sequential.add_module(
            "batchnorm1", nn.BatchNorm3d(num_features=num_kernels)
        )

        # Add rest of the layers
        for l in range(2, num_layers + 1):
            self.sequential.add_module(
                f"convlstm{l}", ConvLSTM(
                    in_channels=num_kernels, out_channels=num_kernels,
                    kernel_size=kernel_size, padding=padding,
                    activation=activation, frame_size=frame_size)
            )

            self.sequential.add_module(
                f"batchnorm{l}", nn.BatchNorm3d(num_features=num_kernels)
            )
        
        def forward(self, x):
            x = self.sequential(x)
            
            return x
  • for 문을 활용하여 layer의 name을 정한 layer 구성을 구축함.
  • .add_module 정의한 순서대로 layer가 쌓인다. -> multi layer를 구성하기 좋다.
  • 이때 Input으로 들어간 데이터가 첫 번째 layer를 거치고 난 후 return되는 output이 다음 순서의 layer의 input으로 들어가게 됩니다.

3. nn.Sequential에서 원하는 layer 불러오기.

Sequential객체.layer명(input)

.add_module()로 추가한 layer name으로 접근하여 layer 연산을 수행할 수 있습니다.

 


4. 내용 고찰

     위의 1)번 방법은 보다 직관적으로 layer 구성을 짤 수 있지만, multi layer를 for문으로 구성하는데 한계가 있는 듯하다. 하지만 2)번 방법은 for문을 통해 동일한 layer 구성의 층을 쉽게 구현할 수 있다.

Comments