데이터 스터디/DL

[Pytorch] 파이토치 nn.Module, nn.funcional (parameter, forward, backward연산)

케이와이엠 2023. 11. 17. 11:44

torch.nn.Module & nn.funcional

두 패키지가 제공하는 기능은 비슷하지만 사용하는 방법에 차이가 있다.
nn패키지 : 가중치(weight), 편향(bias) 값들이 내부에서 자동 생성되는 layer
nn.functional : weight나 bias를 직접 선언

 

nn이 제공하는 기능

  • Parameters
  • Containers
  • Conv Layers
  • Pooling Layers
  • Padding Layers
  • Non-linear Activation
  • Normalization Layers
  • Recuurent Layers
  • Linear Layers
  • Dropout Layers
  • Sparse Layers                                
  • Distance Functions
  • Loss
  • ...

nn.functional이 제공하는 기능

  • Conv functions
  • Pooling functions
  • None-linear activation functions
  • Normalization functions
  • Linear functions
  • Dropout functions
  • Sparse functions
  • Distance functions
  • Loss functions
  • ...

 

torch.nn.Parameter

  • torch.nn.Parameter 클래스는 torch.Tensor 클래스를 상속받아 만들어졌고,
    torch.nn.Module 클래스의 attribute로 할당하면, 자동으로 parameter 리스트(model.parameters())에 추가된다.
  • 파라미터로 지정하고 싶은 텐서일때 사용
self.weights = nn.Parameter(torch.randn(in_features, out_features))
self.bias = nn.Parameter(torch.randn(out_features))

 

하지만 보통은 아래와 같이 하위 모듈을 추가하는 식으로 구현을 하기 때문에(-> 자동으로 파라미터가 설정됨), model.parameters()에 파라미터를 직접 추가할 일이 거의 없다.

class LinearRegression(torch.nn.Module):
  def __init__(self, inputSize, outputSize):
    super(LinearRegression, self).__init__()
    self.linear = torch.nn.Linear(inputSize, outputSize)

  def forward(self, x):
    out = self.linear(x)
    return out

 

gradient초기화 및 계산

# 입력 및 출력 차원 정의, 하이퍼 파라미터 정의
inputDim = 1
outputDim = 1
learningRate = 0.01
epochs = 100

model = LinearRegression(inputDim, outputDim)
# loss function 및 optimizer 정의
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learningRate)
for epoch in range(epochs):
  # input과 label을 PyTorch Variable 객체로 변환
  if torch.cuda.is_available():
    inputs = Variable(torch.from_numpy(x_train).cuda())
    labels = Variable(torch.from_numpy(y_train).cuda())
  else:
    inputs = Variable(torch.from_numpy(x_train))
    labels = Variable(torch.from_numpy(y_train))

  # 이전 기록된 gradient를 0으로 초기화
  optimizer.zero_grad()

  # model을 통해 input forward propagation 진행
  outputs = model(inputs)

  # loss 값 계산
  loss = criterion(outputs, labels)
  print(loss)
  # 모든 파라미터에 대해 gradient 계산
  loss.backward()

  # 파라미터 업데이트
  optimizer.step()

  print('epoch {}, loss {}'.format(epoch, loss.item()))