pytorch 딥러닝 모델 만드는 가이드 라인

JJulme·2021년 9월 15일
0

1. model 생성

torchvision.models를 이용해서 만들어진 모델을 불러올 수 있다.
(점점 많아 지는것 같다.)

import torchvision.models as models

resnet18 = models.resnet18()
alexnet = models.alexnet()
vgg16 = models.vgg16()
squeezenet = models.squeezenet1_0()
densenet = models.densenet161()
inception = models.inception_v3()
googlenet = models.googlenet()
shufflenet = models.shufflenet_v2_x1_0()
mobilenet_v2 = models.mobilenet_v2()
mobilenet_v3_large = models.mobilenet_v3_large()
mobilenet_v3_small = models.mobilenet_v3_small()
resnext50_32x4d = models.resnext50_32x4d()
wide_resnet50_2 = models.wide_resnet50_2()
mnasnet = models.mnasnet1_0()

# pretrained model load - 훈련된 모델 불러오기
resnet18 = models.resnet18(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
...

모델 내용을 확인 하고 싶으면 summary함수를 사용하면 된다.

import torchvision.models as models
from torchsummary import summary

googlenet = models.googlenet()

# (3, 300, 300) 의 입력을 넣어보는 시뮬레이션
summary(googlenet, (3, 300, 300))

    Layer (type)               Output Shape         Param #

===================================================
Conv2d-1 [-1, 64, 150, 150] 9,408
BatchNorm2d-2 [-1, 64, 150, 150] 128
BasicConv2d-3 [-1, 64, 150, 150] 0
MaxPool2d-4 [-1, 64, 75, 75] 0
Conv2d-5 [-1, 64, 75, 75] 4,096

이런식으로 정보를 볼 수 있다.
원래 이쁘게 나온다

2. 손실함수 생성

모델이 얼마나 틀렸는지 계산해 주는 함수이다.

from torch import nn

nn.L1Loss()	# 각 원소별 차이의 절댓값을 계산한다.
nn.MSELoss()	# Mean Squared Error(평균제곱오차) 또는 squared L2 norm을 계산한다.
nn.CrossEntropyLoss()  # Cross Entropy Loss를 계산한다. nn.LogSoftmax() and nn.NLLLoss()를 포함한다. weight argument를 지정할 수 있다.
nn.CTCLoss()	# Connectionist Temporal Classification loss를 계산한다.
nn.NLLLoss()	# Negative log likelihood loss를 계산한다.
nn.PoissonNLLLoss()  # target이 poission 분포를 가진 경우 Negative log likelihood loss를 계산한다.
nn.KLDivLoss()	# Kullback-Leibler divergence Loss를 계산한다.
nn.BCELoss()	# Binary Cross Entropy를 계산한다.
nn.BCEWithLogitsLoss()  #Sigmoid 레이어와 BCELoss를 하나로 합친 것인데, 홈페이지의 설명에 따르면 두 개를 따로 쓰는 것보다 이 함수를 쓰는 것이 조금 더 수치 안정성을 가진다고 한다.

이외에 MarginRankingLoss, HingeEmbeddingLoss, MultiLabelMarginLoss, SmoothL1Loss, SoftMarginLoss, MultiLabelSoftMarginLoss, CosineEmbeddingLoss, MultiMarginLoss, TripletMarginLoss를 계산하는 함수들이 있다. 필요하면 찾아보자.

너무 많고 어떤게 어느 훈련에서 좋은지 잘 모른다.

import torch
from torch import nn
criterion  = nn.MSELoss()
prediction = torch.Tensor([12, 21, 30, 41, 52]) # 예측값
target     = torch.Tensor([10, 20, 30, 40, 50]) # 정답
loss       = criterion(prediction, target)
print(loss)
# tensor(2.)
# loss = (2^2 + 1^2 + 0^2 + 1^2 + 2^2) / 5 = 2

criterion_reduction_none = nn.MSELoss(reduction='none')
	# reduction = none|mean|sum (디폴트는 mean)
loss = criterion_reduction_none(prediction, target)
print(loss)
# tensor([4., 1., 0., 1., 4.])

3. optimizer 생성

optimizer: 손실 함수의 결과값을 최소화하기 위한 모델의 가중치를 찾는 것

optimizer의 종류
각각의 자세한 기능은 잘 모르겠다

optim.Adadelta, optim.Adagrad, optim.Adam, optim.SparseAdam, optim.Adamax
optim.ASGD, optim.LBFGS
optim.RMSprop, optim.Rprop
optim.SGD

optimizer 사용법

import torch.optim as optim

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

4. Pytorch LR(Learning Rate) Scheduler

Learning Rate의 보폭을 조절해 준다.
보통 훈련이 진행될수록 보폭이 짧아지는 것이 이상적이다.

optim.lr_scheduler.LambdaLR: lambda 함수를 하나 받아 그 함수의 결과를 lr로 설정한다.
optim.lr_scheduler.StepLR: 특정 step마다 lr을 gamma 비율만큼 감소시킨다.
optim.lr_scheduler.MultiStepLR: StepLR과 비슷한데 매 step마다가 아닌 지정된 epoch에만 gamma 비율로 감소시킨다.
optim.lr_scheduler.ExponentialLR: lr을 지수함수적으로 감소시킨다.
optim.lr_scheduler.CosineAnnealingLR: lr을 cosine 함수의 형태처럼 변화시킨다. lr이 커졌다가 작아졌다가 한다.
optim.lr_scheduler.ReduceLROnPlateau: 이 scheduler는 다른 것들과는 달리 학습이 잘 되고 있는지 아닌지에 따라 동적으로 lr을 변화시킬 수 있다. 보통 validation set의 loss를 인자로 주어서 사전에 지정한 epoch동안 loss가 줄어들지 않으면 lr을 감소시키는 방식이다.

참고

https://greeksharifa.github.io/pytorch/2018/11/10/pytorch-usage-03-How-to-Use-PyTorch/

0개의 댓글