optimizer 클래스 초기화
제일 중요한 매개변수는 신경망의 파라메터이다. Variable 타입의 파라메터들을 iterable 오브젝트로 넣어줘야한다. 그 외에는 각 optimizer 타입에 따라 learning rate, weight decay 등을 넣어주면 된다.
parameters() 메소드는 모듈의 파라메터들을 iterator로 반환한다고 적혀있다.
신경망 구조를 구현할때 보통 아래와 같이 하위 모듈을 추가하는식으로 구현을 하기 때문에, 파라메터를 직접 추가할 일이 거의 없었다.
class MyModule(torch.nn.Module):
def __init__(self):
super(MyModule, self).__init__()
self.A = torch.nn.Linear(100, 200)
self.B = torch.nn.Linear(200, 10)
def forward(input):
return self.B(self.A(input))
하위 모듈만 추가해도 자동으로 파라메터가 설정되는 마법(?)은 어떻게 구현된 것일까?
def __init__(self):
"""
Initializes internal Module state, shared by both nn.Module and ScriptModule.
"""
torch._C._log_api_usage_once("python.nn_module")
self.training = True
self._parameters = OrderedDict()
self._buffers = OrderedDict()
self._backward_hooks = OrderedDict()
self._forward_hooks = OrderedDict()
self._forward_pre_hooks = OrderedDict()
self._state_dict_hooks = OrderedDict()
self._load_state_dict_pre_hooks = OrderedDict()
self._modules = OrderedDict()
위 코드는 torch.nn.Module 클래스의 생성자를 정의하는데, _parameters와 _modules 라는 딕셔너리 타입의 멤버변수들이 있는것을 볼 수 있다. 당연하지만 _paramters는 파라메터들이, _modules에는 하위 모듈들이 들어간다. (key: 이름, value: 인스턴스)
조금 더 코드를 읽어본 결과, parameters() 메소드는 먼저 모든 하위 모듈들을 탐색하고(recursive=True), 각 모듈의 _parameters에 들어있는 파라메터들을 하나씩 반환해주는 함수였다.
아래의 그림은 모듈의 한 예시인데, 이 경우 A.parameters()를 호출하면, [A.B.weight, A.B.bias, A.C.D.weight, A.C.D.bias]가 반환된다. (물론 recursive=False를 지정하면 직접 A에 속한 파라메터만 반환하는데, 아래 경우에는 아무것도 반환되지 않게된다.)
'AI > PyTorch' 카테고리의 다른 글
[PyTorch] CNN 설계 5. 네트워크 설계 (0) | 2021.06.15 |
---|---|
[PyTorch] CNN 설계 4. Dataset 및 DataLoader 할당 (0) | 2021.06.15 |
[PyTorch] torch.nn 제공함수 (0) | 2021.06.15 |
[PyTorch] CNN 설계 순서 1 - 3 (0) | 2021.06.15 |
[PyTorch] torch.nn 과 torch.nn.functional (0) | 2021.06.10 |