nn.Module
딥러닝을 구성하는 Layer의 base class이다.
Input, Output, Forward, Backward / 학습의 대상이 되는 parameter를 정의해야 한다.
nn.Module 과 super().__init__()
코드
1
2
3
4
5
6
7
|
class GNNStack(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim, task='node'):
super(GNNStack, self).__init__()
self.task = task
# ModuleList(): 각 레이어를 리스트에 전달하고 레이어의 iterator를 만든다.
self.convs = nn.ModuleList()
|
cs |
파이토치에서 신경망은 보통 신경망 모듈(torch.nn.Module)을 상속받는 파이썬 클래스로 정의한다. nn.Module을 상속받으면 파이토치 프레임워크에 있는 각종 도구를 쉽게 적용할 수 있다. 신경망의 구조와 동작을 정의하는 생성자를 모델 클래스에 정의한다.
_ _ init _ _ () 함수는 파이썬에서 객체가 갖는 속성값을 초기화하는 역할로, 객체가 생성될 때 자동으로 호출된다. super() 함수를 부르면 위 예시의 GNNStack 클래스는 파이토치의 nn.Module 클래스의 속성을 가지고 초기화된다.
* super(파생클래스, self).__init__() : super().__init__() 와 기능의 차이는 없으며, 파생클래스를 명시해주는 역할을 하는 것이다.
* reference : https://stackoverflow.com/questions/63058355/why-is-the-super-constructor-necessary-in-pytorch-custom-modules
https://daebaq27.tistory.com/60
위 스택오버플로우에서 super().init()를 안해주면 Attribute Error를 발생하게 되는데, setattr 함수를 내부에서 실행하는데, 이 함수는 nn.Module에서 상속받아오기 때문에 오류가 발생한다. 즉, nn.Module에는 모델을 실행시킬 때 필요한 파라미터, 모듈 등 중요한 특성을 담고있기 때문에 상속받아오고, 초기화가 필요하다.
Autograd and Optimizer
nn.Parameter
Parameter : nn.Module 내에 attribute가 될 때는 required_grad=True로 지정되어 학습 대상이 되는 Tensor이다.
Backward
Layer에 있는 파라미터들의 미분을 수행한다.
Forward의 결과값(model 의 output; 예측치)과 실제값과의 차이(loss)에 대해 미분을 수행한다.
해당 미분값으로 파라미터를 업데이트 한다.
코드
1
2
3
4
5
6
7
8
9
10
|
for epoch in range(epochs):
# init gradient
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
# get gradients w.r.t to parameters
loss.backward()
# update parameters
optimizer.step()
|
cs |
'네이버 부스트캠프 AI tech 3기' 카테고리의 다른 글
8. ResNet 리뷰 (0) | 2022.02.03 |
---|---|
7. PyTorch DataLoader (0) | 2022.02.02 |
5. CNN과 RNN (0) | 2022.01.25 |
4. 확률론, 베이즈 (0) | 2022.01.25 |
3. 딥러닝 학습방법 이해하기 (0) | 2022.01.24 |