[인공지능사관학교: 자연어분석A반] 학습 내용 보충 - nn.MSELoss vs. F.mse_loss

Suhyeon Lee·2025년 7월 25일

블로그 글 내용 정리

nn.MSELoss와 F.mse_loss 간 차이가 있나요?

  • 기능은 아무런 차이가 없다고 함
  • 다만, 사용하는 데 있어 사용법이 다름!

nn.MSELoss

  • 사용법 1
criterion = nn.MSELoss()
loss = criterion(outputs, batch_y)
  • 사용법 2
loss = nn.MSELoss()(outputs, batch_y)
  • 다만, 아래와 같이 사용하면 절대 안 된다!
    • 왜냐하면 MSELoss object를 먼저 생성하고, 이후에 적용해야 하기 때문
    • That is, you have to construct an MSELoss object first, and then call(apply) it
loss = nn.MSELoss(outputs. batch_y) # 잘못된 사용법

F.mse_loss

loss = F.mse_loss(outputs, batch_y)

PyTorch로 MSE 구현하기

소개하는 3가지 경우에서 yyyhaty_{hat}(ypredy_{pred})는 모두 같은 shape을 가지고 있어야 함

  1. MSE를 함수로 정의하여 구현
def mse(y, y_pred):
  return ((y-y_pred)**2).mean()

import torch

y = torch.FloatTensor([[1, 1],
                       [2, 2]])
y_pred = torch.FloatTensor([[0, 0],
                            [0, 0]])

print(mse(y, y_pred)) # tensor(2.5000)
  1. torch.nn.functional 함수 사용
import torch
import torch.nn.functional as F

y = torch.FloatTensor([[1, 1],
                       [2, 2]])
y_pred = torch.FloatTensor([[0, 0],
                            [0, 0]])

F.mse_loss(y, y_pred) # tensor(2.5000)
  • 해당 함수는 reduction 인자를 이용해 차원 연산에 대한 설정이 가능함
    • 기본값은 reduction = 'mean'
import torch
import torch.nn.functional as F

y = torch.FloatTensor([[1, 1],
                       [2, 2]])
y_pred = torch.FloatTensor([[0, 0],
                            [0, 0]])

print(F.mse_loss(y, y_pred, reduction = 'mean'))
print(F.mse_loss(y, y_pred, reduction = 'sum'))
print(F.mse_loss(y, y_pred, reduction = 'none'))
tensor(2.5000)
tensor(10.)
tensor([[1., 1.],
        [4., 4.]])
  1. torch.nn 사용하기: torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean') 클래스
import torch
import torch.nn as nn

y = torch.FloatTensor([[1, 1],
                       [2, 2]])
y_pred = torch.FloatTensor([[0, 0],
                            [0, 0]])

criterion = nn.MSELoss()
criterion(y, y_pred) # tensor(2.5000)
  • torch.nn.functional의 mse_loss를 이용한 방법과 torch.nn의 MSELoss를 이용한 방법의 차이는 거의 없음
  • 단, torch.nn의 MSELoss 를 사용하면 nn.Module의 하위 클래스 내부에 선언하기 때문에 하나의 layer처럼 취급할 수 있음
profile
2 B R 0 2 B

0개의 댓글