Hello Computer Vision

Cross Entropy 초기 loss알아보기 본문

딥러닝/손실함수

Cross Entropy 초기 loss알아보기

지웅쓰 2023. 9. 26. 16:50

사실 딥러닝 모델을 훈련시키면 그냥 loss가 떨어지면 떨어지는 갑다~ 하고 그냥 지켜보고 거의 무조건적으로 수렴할 생각으로 지켜본다. 그러나 최근에 와서 느낀건데 수렴을 안하는 경우도 상당히 많으며 이를 위해서는 초기 loss가 어느정도 되는지도 중요하다. 그래야 1epoch후 얼마나 줄어들었고를 어느정도 알 수 있기 때문이다.

 

CrossEntropy를 사용할 경우 10개의 클래스를 시험해본다면 평균 정답률은 10%정도일 것이다. 그러면 초기 loss는 어느 정도 될까?

dataset = datasets.CIFAR10(root = './sample_data', train = True, download = True, transform = transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size = 32, shuffle = True)

loss_fn = nn.CrossEntropyLoss(reduction = 'mean')

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(32* 32 * 3, 128)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(128, 100)
        self.fc3 = nn.Linear(100, 10)

    def forward(self, x):
        x = x.view(-1, 32 * 32 * 3)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        x = self.relu(x)
        x = self.fc3(x)
        return x

net = Net()
running_loss = 0
for x, y in dataloader:

  output = net(x)
  loss = loss_fn(output, y)
  running_loss += loss
print(running_loss / len(dataloader))
tensor(2.3045, grad_fn=<DivBackward0>)

초기 loss 는 2.3인걸 알 수 있다. 주의할 점은 여기서 crossentropy의 기본 세팅은 mean으로되어있다. sum으로 한다면 배치 안 데이터 모든 loss가 합쳐지고 여기서배치사이즈는 32이기 때문에 32 * 2.3인 약 72정도가 나올 것이다. 즉 우리가 주로하는 running loss를 epoch마다 0으로 설정하고 배치개수만큼 나눠주고 이를 출력해 나오는 loss는 데이터 1개 평균 loss인것을 알 수 있다. 똑같은 메커니즘으로 같은 개수의 클래스를 가지고 있는MNIST도 초기 loss는 2.3이 나온다.

 

그렇다면 CIFAR 100의 초기 loss는 어떻게 나올까?

실험해본 결과 4.6. 딱 2배로 나온다. 간단한 실험이고 어렵지 않으니 재미로 한번 해보는 것도 좋을 거 같다.