Updated:

torch.nn

  • PyTorch의 Neural Network 패키지
  • graph를 만들기 위한 basic building blocks


nn.Linear()

  • linear transformation ($y=xA^T+b$) 해주는 함수
X = torch.Tensor([[1, 2],[3, 4]])

# in : ?*2 → out : ?*5
linear_transformed = nn.Linear(2,5)  # in_features, out_features

output = linear_transformed(X)
output.size()

"""
출력결과
torch.Size([2, 5])
"""


torch.nn vs. torch.nn.functional

torch.nn.functional

  • python function

torch.nn

  • python class


torch.nn.Module

  • torch.nn 패키지의 container 중 하나
  • 딥러닝을 구성하는 Layer의 base class
    • Input, Output, Forward, Backward 정의
    • 학습의 대상이 되는 parameter(tensor) 정의

[번외] Python의 container 자료구조

  • data type의 저장 모델로 종류에 무관하게 데이터를 저장할 수 있다.
  • 속성과 기능을 함께 캡슐화함으로써 데이터를 담고 있는 객체 (일종의 클래스)
  • python 내장 컨테이너 타입 : list, tuple, set, dictionary


torch.nn.Parameter

  • Tensor 객체의 상속 객체
  • nn.Module 내의 attribute가 될 때는 required_grad=True로 지정되어 학습 대상이 되는 Tensor
  • 직접 지정할 일은 거의 없다. (대부분의 layer에는 weights 값들이 지정되어 있다.)
  • 파라미터 (weight, bias)를 그냥 tensor로 만들면 gradient를 계산하지 않아 값도 업데이트 되지 않고, 모델을 저장할 때 무시된다.


Buffer

  • 값을 업데이트 시킬 필요는 없지만 저장하고 싶은 경우 사용한다.
class Model(nn.Module):
    def __init__(self):
        super().__init__()

        self.parameter = Parameter(torch.Tensor([7]))
        self.tensor = torch.Tensor([7])

				# 7이라는 tensor를 버퍼에 등록
        self.register_buffer("buffer",self.tensor)

model = Model()

try:
    buffer = model.get_buffer('buffer')
    if buffer == 7:
        print(model.state_dict())
    else:
        print("버퍼에 다른 값이 저장되어 있습니다.")
except:
    print("버퍼에 저장된 값이 없습니다.")


Tensor vs. Parameter vs. Buffer

Tensor

  • ❌ gradient 계산
  • ❌ 값 업데이트
  • ❌ 모델 저장 시 값 저장

Parameter

  • ✅ gradient 계산
  • ✅ 값 업데이트
  • ✅ 모델 저장 시 값 저장

Buffer

  • ❌ gradient 계산
  • ❌ 값 업데이트
  • ✅ 모델 저장 시 값 저장

Categories:

Updated: