본문 바로가기
Python/PyTorch

[PyTorch] nn과 nn.functional

by _sweep 2022. 2. 23.

이수안컴퓨터연구소파이토치(PyTorch) 기초 영상을 보고 정리한 내용입니다.

 

 

torch.nn & torch.nn.functional

PyTorch는 신경망(Neural Network) 생성, 학습을 위해 torch.nn 또는 torch.nn.functional 패키지를 제공한다.

torch.nn 또는 torch.nn.functional 패키지를 통해 자동미분(autograd) 관련 작업을 진행할 수 있다.

이 두 패키지는 같은 기능을 제공하지만 방식이 조금 다르다.

결론만 말하자면 torch.nn은 attribute를 활용해 state를 저장, 활용하고 torch.nn.functional로 구현한 함수의 경우에는 인스턴스화시킬 필요없이 바로 사용이 가능하다.

 

 

torch.nn

torch.nn은 주로 가중치(weights), 편향(bias) 값들이 내부에서 자동으로 생성되는 레이어들을 사용할 때 쓰인다.
값들이 자동으로 생성되기 때문에 weight 값들을 직접 선언하지 않는다.

 

torch.nn의 예시는 다음과 같다.

  • Containers
  • Convolution Layers
  • Pooling layers
  • Padding Layers
  • Non-linear Activations (weighted sum, nonlinearity)
  • Non-linear Activations (other)
  • Normalization Layers
  • Recurrent Layers
  • Transformer Layers
  • Linear Layers
  • Dropout Layers
  • Sparse Layers
  • Distance Functions
  • Loss Functions

 

✔️ Convolution Layers

먼저 Convolution은 이미지 위에 stride 값만큼 kernel을 이동시키면서 겹쳐지는 부분의 각 원소 값을 모두 곱한뒤 더한 값을 출력하는 연산이다.

 

 

PyTorch에서는 torch.nn.Conv2d로 위 연산을 제공한다.

 

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

 

이를 활용한 예제는 다음과 같다.

 

import torch
import torch.nn as nn

m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))

input = torch.randn(20, 16, 50, 100)
output = m(input)

print(output.shape)

# output
# torch.Size([20, 33, 26, 100])

 

 

torch.nn.functional

torch.nn.functional은 torch.nn과 달리 가중치(weights)를 직접 선언하여 인자로 넣어주어야 한다.
torch.nn.functional의 예시는 다음과 같다.

  • Convolution functions
  • Pooling functions
  • Non-linear activation functions
  • Normalization functions
  • Linear functions
  • Dropout functions
  • Sparse functions
  • Distance functions
  • Loss functions

 

✔️ Convolution functions

torch.nn.Conv2d()가 존재하듯이 torch.nn.functional에는 같은 연산으로 torch.nn.functional.conv2d()가 있다.

 

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

 

이를 활용한 예제는 다음과 같다.

 

import torch
import torch.nn.functional as F

filters = torch.randn(8, 4, 3, 3)
inputs = torch.randn(1, 4, 5, 5)
conv = F.conv2d(inputs, filters, padding=1)
print(conv.shape)

# output
# torch.Size([1, 8, 5, 5])

 

 

🔍 참조

torch.nn.Conv2d https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

torch.nn.functional.conv2d https://pytorch.org/docs/stable/generated/torch.nn.functional.conv2d.html



 

 

 

'Python > PyTorch' 카테고리의 다른 글

[PyTorch] Torchvision과 utils.data  (0) 2022.02.23
[PyTorch] CUDA와 자동미분  (0) 2022.02.23
[PyTorch] 텐서의 연산과 조작  (0) 2022.02.22
[PyTorch] 파이토치와 텐서  (0) 2022.02.22

댓글