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
이런식으로 정보를 볼 수 있다.
원래 이쁘게 나온다
모델이 얼마나 틀렸는지 계산해 주는 함수이다.
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.])
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)
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/