Module, model, layer, function
- module: PyTorch에서 제공하는 기본적인 구성 요소로서, 모델의 각 구성 요소를 캡슐화하는 클래스입니다. nn.Module 클래스를 상속하여 사용되며, 레이어와 함수 등을 포함할 수 있습니다.
- model: 모델은 레이어와 함수 등을 조합하여 구성된 전체 딥러닝 모델을 나타냅니다. 모델은 PyTorch의 nn.Module 클래스를 상속받아 정의되며, 레이어와 함수 등을 조합하여 전체 모델을 구성합니다.
- layer: 레이어는 모델을 구성하는 기본 구성 요소입니다. 레이어는 입력 데이터를 받아들이고 출력 데이터를 생성하는 함수를 나타내며, PyTorch에서 제공하는 nn.Module을 상속하여 정의됩니다.
- function: 함수는 레이어와 유사하지만, 모델 내에서 개별적으로 사용됩니다. 함수는 일반적으로 특정 계산을 수행하는 데 사용됩니다. 예를 들어, PyTorch에서 제공하는 nn.functional 모듈에는 다양한 활성화 함수 (ReLU, sigmoid, tanh 등) 및 손실 함수 (MSE, Cross-entropy 등)가 포함되어 있습니다.
Module안에 module이 있을 수 있다. model 들은 layer들로 이루어져있으면 이러한 layer들은 또 최소의 기능단위인 function들로 이루어져 있다.
nn.Module 로 Custum Model 만들기
1. nn.Module 클래스를 상속받는 새로운 클래스를 만듭니다.
import torch.nn as nn
class MyModule(nn.Module):
def __init__(self, input_size, output_size):
super(MyModule, self).__init__()
# 모듈 내부에서 사용할 파라미터, 서브 모듈 등을 정의합니다.
self.linear = nn.Linear(input_size, output_size)
2. 생성자 __init__()에서 모듈 내부에서 사용할 파라미터, 서브 모듈 등을 정의합니다. 반드시 명시적으로 super() 함수를 사용하여 nn.Module의 생성자를 호출하여 초기화해줘합니다.
만든 모듈을 연속적으로 사용하기 - Container
torch.nn.Sequential
torch.nn.Sequential은 PyTorch에서 제공하는 뉴럴 네트워크 모듈 중 하나로, 레이어를 순차적으로 쌓아 하나의 뉴럴 네트워크 모델을 만들기 위해 사용됩니다.
torch.nn.Sequential은 레이어를 순서대로 나열하여 하나의 시퀀스로 만듭니다. 이 때, 시퀀스 내 각 레이어는 객체로 생성되어야 합니다. 생성된 객체들은 torch.nn.Sequential에 인자로 전달됩니다. 이렇게 하면 각 레이어의 forward 메소드가 순차적으로 실행되어 전체 모델의 출력값을 계산할 수 있습니다.
아래는 torch.nn.Sequential을 사용하여 nn.Linear와 nn.ReLU 레이어를 순차적으로 쌓아 간단한 뉴럴 네트워크 모델을 만드는 예제 코드입니다:
import torch
import torch.nn as nn
# nn.Sequential로 모델 만들기
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 30),
nn.ReLU(),
nn.Linear(30, 1)
)
# 모델에 입력값 전달하여 출력값 계산하기
input = torch.randn(1, 10)
output = model(input)
print(output)
torch.nn.ModuleList
nn.ModuleList는 PyTorch에서 제공하는 뉴럴 네트워크 모듈 중 하나로, 모듈들의 리스트를 감싸서 하나의 뉴럴 네트워크 모듈로 만드는 데 사용됩니다.
nn.ModuleList는 nn.Module 클래스를 상속받은 객체들의 리스트를 감싸는 역할을 합니다. 이 때, 리스트 내의 모듈 객체들은 일반적으로 nn.Module 클래스를 상속받아 생성됩니다. nn.ModuleList 객체는 forward 메서드를 가지며, 이 메서드는 내부의 각 모듈 객체들의 forward 메서드를 차례로 호출하여 전체 모델의 출력값을 계산합니다.
아래는 nn.ModuleList를 사용하여 nn.Linear 레이어와 nn.ReLU 레이어를 리스트로 만들어 간단한 뉴럴 네트워크 모델을 만드는 예제 코드입니다:
import torch
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layers = nn.ModuleList([
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 30),
nn.ReLU(),
nn.Linear(30, 1)
])
def forward(self, x):
for layer in self.layers:
x = layer(x)
return x
# 모델 객체 생성하기
model = Net()
# 모델에 입력값 전달하여 출력값 계산하기
input = torch.randn(1, 10)
output = model(input)
print(output)
torch.nn.ModuleDict
nn.ModuleDict는 PyTorch에서 제공하는 뉴럴 네트워크 모듈 중 하나로, 모듈들의 사전을 감싸서 하나의 뉴럴 네트워크 모듈로 만드는 데 사용됩니다.
nn.ModuleDict는 nn.Module 클래스를 상속받은 객체들의 사전을 감싸는 역할을 합니다. 이 때, 사전 내의 모듈 객체들은 일반적으로 nn.Module 클래스를 상속받아 생성됩니다. nn.ModuleDict 객체는 forward 메서드를 가지며, 이 메서드는 내부의 각 모듈 객체들의 forward 메서드를 차례로 호출하여 전체 모델의 출력값을 계산합니다.
아래는 nn.ModuleDict를 사용하여 nn.Linear 레이어와 nn.ReLU 레이어를 사전으로 만들어 간단한 뉴럴 네트워크 모델을 만드는 예제 코드입니다.
import torch
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layers = nn.ModuleDict({
'layer1': nn.Linear(10, 20),
'activation1': nn.ReLU(),
'layer2': nn.Linear(20, 30),
'activation2': nn.ReLU(),
'layer3': nn.Linear(30, 1)
})
def forward(self, x):
for layer in self.layers.values():
x = layer(x)
return x
# 모델 객체 생성
번외 PythonList vs PyTorch의 ModuleList
일반 List와 달리 ModuleList는 모델 파라미터를 PyTorch가 추적하고 업데이트할 수 있습니다.
PyTorch의 학습 알고리즘은 nn.Parameter 객체에서 파생된 객체들만 업데이트합니다. nn.ModuleList 안에 있는 모든 nn.Module 객체들은 nn.Parameter를 상속받아서 파라미터로 취급됩니다.
nn.Linear같은 모듈들은 weight 값과 bias를 어디서 만들까?? - Parameter()
Linear 같은 모듈은 미리 Parameter() 함수를 통해 weight와 bias 텐서를 만들어 놓습는다.
PyTorch에서 nn.Parameter 클래스는 모델 내에서 학습 가능한 매개변수(파라미터)를 나타내기 위해 사용됩니다. 일반적으로 모델의 가중치(weight)와 편향(bias)이 이에 해당됩니다.
nn.Parameter 클래스는 내부적으로 torch.Tensor를 상속합니다. 따라서 nn.Parameter 객체는 Tensor와 동일한 연산을 수행할 수 있습니다. 그러나 nn.Parameter 객체는 PyTorch의 자동 미분 기능에서 학습 가능한 매개변수로 처리됩니다.
nn.Parameter 객체를 만들 때에는 다음과 같이 사용합니다:
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.weight = nn.Parameter(torch.randn(10, 5))
self.bias = nn.Parameter(torch.zeros(10))
def forward(self, x):
out = torch.matmul(x, self.weight) + self.bias
return out
하지만 보통 parameter()함수를 직접 선언할 일은 많지않다.
Tensor vs Parameter
Parameter 함수를 사용하면 output tensor에서 gradient 계산함수가 같이 반환 된다. 따라서 grad를 호출하면 미분된 값을 얻을 수 있다는 장점이 있다.
일반 Tesor를 모델 저장시 값을 계산하고 싶을 때 - Buffer
PyTorch에서 buffer는 모델 내부의 매개 변수가 아닌 추가 데이터 저장소입니다. 이러한 추가 데이터는 모델의 가중치와 함께 사용되며, 예를 들어 모델의 평균 및 분산과 같은 통계 정보를 저장하는 데 사용될 수 있습니다.
PyTorch buffer는 모델 클래스의 register_buffer() 메서드를 사용하여 등록됩니다. 이 메서드는 두 개의 인수를 사용합니다. 첫 번째 인수는 버퍼의 이름, 두 번째 인수는 버퍼 자체입니다.
예를 들어, 다음 코드에서는 두 개의 버퍼를 등록합니다.
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.register_buffer('mean', torch.zeros(1))
self.register_buffer('var', torch.ones(1))
Tensor | Parameter | Buffer | |
gradient 계산 | x | o | x |
값 업데이트 | x | o | x |
모델 저장시 저장 | x | o | o |
'AI > Pytorch' 카테고리의 다른 글
nn.Module의 hook 과 apply (0) | 2023.03.17 |
---|---|
모듈 분석,Docstring,repr (0) | 2023.03.16 |
PyTorch Document 2 (0) | 2023.03.16 |
PyTorch Document 1 (0) | 2023.03.14 |
Pytorch basic (0) | 2023.03.13 |