플로라도의 data workout

파이토치 torch.nn.functional.avg_pool2d vs torch.nn.AvgPool2d의 차이점 본문

기초 노트/PyTorch

파이토치 torch.nn.functional.avg_pool2d vs torch.nn.AvgPool2d의 차이점

플로라도 2024. 5. 2. 00:32

 

파이토치에서 torch.nn.functional모듈은 통상 F로 임포트하여 사용되곤하는데

이때 nn모듈의 클래스들과 비교가 된다.

 

예를 들면, F.avg_pool2d와 nn.AvgPool2d는 정확히 동일한 기능을 제공하지만, 두 함수의 사용 방법과 적용하는 컨텍스트에는 차이가 있다.

 

 

 1.F.avg_pool2d

- 모듈 : torch.nn.functional

 

- 특징 :

 1. 매 호출마다 풀링 파라미터를 지정해야 하므로, 동적인 풀링 사이즈나 조건에 따른 풀링을 적용해야 할때 사용한다.

 2. 함수형 API를 사용하므로, 코드에서 '절차적' 접근을할때 적합하다.

 3. 상태가 없는 절차적 함수이므로 nn.Sequential의 구성요소로 추가될 수 없다.

 

- 사용 예

import torch
import torch.nn.functional as F

input = torch.randn(20, 16, 50, 32)  # 임의의 입력 데이터
output = F.avg_pool2d(input, kernel_size=3, stride=2, padding=1)

 

 

2.torch.nn.AvgPool2d

- 모듈 : torch.nn

 

- 특징 

 1. 상태를 가질 수 있고, 한번 설정하면 동일한 파라미터를 사용하여 여러 입력에 대해 풀링을 적용할 수 있음으로, 모델의 정의 부분에서 사용하기 쉽다.

 2. 객체 지향적 API를 사용하여, 모듈화 및 재사용이 용이해 모델을 정의할때 일반적으로 선호된다.

 3. nn.Module을 상속받은 클래스로, nn.Sequential안에 한 구성요소로서, 즉 하나의 레이어로서 포함될 수 있다.

 

- 사용 예

import torch
import torch.nn as nn

pool_layer = nn.AvgPool2d(kernel_size=3, stride=2, padding=1)
input = torch.randn(20, 16, 50, 32)  # 임의의 입력 데이터
output = pool_layer(input)

 

 

 

 

커스텀 모듈에서의 functional F사용

 

그럼 nn.functional이 nn모듈 대비 장점이 없는듯한데 도대체 무슨 소용인가 싶을 수도 있지만,

nn.Module을 상속받아, 커스텀 모듈을 만들때 사용되어 이를 nn.Sequential에 넘겨주는 방식으로 모델에 작성하는 것이 일반적인 방식이라고 한다.

 

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

class MyAvgPool2d(nn.Module):
    def __init__(self, kernel_size, stride):
        super(MyAvgPool2d, self).__init__()
        self.kernel_size = kernel_size
        self.stride = stride
    
    def forward(self, x):
        return F.avg_pool2d(x, self.kernel_size, self.stride)

# Sequential 모델 정의, 커스텀 AvgPool2d 사용
model = nn.Sequential(
    nn.Conv2d(1, 20, 5),
    nn.ReLU(),
    MyAvgPool2d(kernel_size=2, stride=2),  # 커스텀 모듈 사용
    nn.Conv2d(20, 50, 5),
    nn.ReLU(),
    MyAvgPool2d(kernel_size=2, stride=2)  # 커스텀 모듈 사용
)

print(model)