728x90
파이토치로 모델링을 할 때 nn을 사용할 때도 있고 nn.functional을 사용할 때도 있다.
이 둘의 차이점은 무엇인지 알아보자.
먼저 nn을 사용하는 코드는 다음과 같다.
import torch
import torch.nn as nn
inputs = torch.randn(64, 3, 244, 244)
conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)
outputs = conv(inputs)
layer = nn.Conv2d(1, 1, 3)
nn.functional을 사용하는 코드는 다음과 같다.
import torch.nn.functional as F
inputs = torch.randn(64, 3, 244, 244)
weight = torch.randn(64, 3, 3, 3)
bias = torch.randn(64)
outputs = F.conv2d(inputs, weight, bias, padding=1)
nn.Conv2d에서 input_channel과 output_channel을 사용해서 연산했다면 functional.conv2d는 입력과 가중치 자체를 직접 넣어준다. 이때 직접 넣어준다는 의미는 가중치를 전달해야 할 때마다 가중치 값을 새로 정의해야 함을 의미한다.
다음은 nn과 nn.functional을 비교한 표이다.
구분 | nn | nn.functional |
형태 | nn.Conv2d : 클래스 nn.Module 클래스를 상속받아 사용 |
nn.functional.conv2d : 함수 def function (input)으로 정의된 순수한 함수 |
호출 방법 | 하이퍼파라미터를 전달한 후 함수 호출을 통해 데이터 전달 | 함수를 호출할 때 하이퍼파라미터, 데이터 전달 |
위치 | nn.Sequential 내에 위치 | nn.Sequential에 위치할 수 없음 |
파라미터 | 파라미터를 새로 정의할 필요 없음 | 가중치를 수동으로 전달해야 할 때마다 자체 가중치를 정의 |
728x90
'딥러닝 > Pytorch' 카테고리의 다른 글
tensor의 복사방법 (0) | 2022.08.06 |
---|---|
[Pytorch] register_buffer (0) | 2022.08.01 |
torch - GPU 사용하기 (0) | 2022.06.13 |
Pytorch nn.ModuleList (0) | 2022.05.30 |
Pytorch nn.Embedding() (0) | 2022.05.30 |