Pytorch 의 학습 율 감소 및 그 용법 에 대한 상세 한 설명
학 습 률 감 소 는 매우 효과 적 인 연단 기법 중 하나 로 신경 망 의 훈련 과정 에서 accuracy 가 진동 하거나 loss 가 더 이상 떨 어 지지 않 을 때 적당 한 학 습 률 감 소 를 하 는 것 은 효과 적 인 수단 으로 accuracy 를 뚜렷하게 향상 시 킬 수 있다.
Pytorch 에는 두 가지 학 습 률 조정(감쇠)방법 이 있 습 니 다.
라 이브 러 리 함수 로 조정 하기;
수 동 조정.
1.라 이브 러 리 함 수 를 사용 하여 조정:
Pytorch 학 습 률 조정 전략 torch.optim.lrsheduler 인터페이스 구현.pytorch 가 제공 하 는 학습 율 조정 전략 은 세 가지 로 나 뉘 는데 그것 이 바로:
(1)질서 있 는 조정:등 간격 조정(Step),다 중 간격 조정(MultiStep),지수 감쇠(Exponential),코사인 소 둔(CosineAnnealing);
(2)자가 적응 조정:훈련 상황 에 따라 기 회 를 엿 보고 특정한 지표의 변화 상황(loss,accuracy)을 감 측 함으로써 이 기준 이 별로 변화 하지 않 을 때 학습 율 을 조정 하 는 시기(ReduceLRON Plateau)이다.
(3)사용자 정의 조정:epoch 에 대한 lambda 함 수 를 사용자 정의 하여 학 습 률(LambdaLR)을 조정 합 니 다.
모든 epoch 의 훈련 에서 scheduler.step()문 구 를 사용 하여 학습 율 을 업데이트 합 니 다.이 방법 은 optimizer.step()업데이트 모델 파라미터,즉 한 번 epoch 가 scheduler.step()에 대응 하 는 것 과 유사 합 니 다.그러나 미니-batch 훈련 에 서 는 미니-bitch 마다 optimizer.step()에 대응 합 니 다.즉 용법 은 다음 과 같다.
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
def train(...):
for i, data in enumerate(train_loader):
......
y_ = model(x)
loss = criterion(y_,y)
loss.backward()
optimizer.step()
......
for epoch in range(epochs):
scheduler.step()
train(...)
test(...)
(1)등 간격 조정 학 습 률 StepLR
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
매 조련 stepsize 개 epoch,학 습 률 lr=lr*gamma 로 조정.다음 내용 에 서 는 epoch 와 step 를 대등 하 게 합 니 다.epoch 마다 scheduler.step()만 진행 되 기 때문에 이 step 는 scheduler.step()의 step,즉 step 를 말 합 니 다.size 는 scheduler.step()가 진행 하 는 횟수 를 가리킨다.
인자:
optimizer:신경 망 훈련 에 사용 되 는 최적화 기,예 를 들 어 optimizer=torch.optim.SGD(...)
step_size(int):학습 율 하락 간격 수,단 위 는 epoch 이지 iteration 이 아 닙 니 다.
gamma(float):학습 율 조정 배수,기본 값 0.1
last_epoch(int):이전 epoch 수 입 니 다.이 변 수 는 학습 율 을 조정 해 야 하 는 지 여 부 를 표시 합 니 다.lastepoch 가 설 정 된 간격 에 부합 할 때 학습 율 을 조정 합 니 다.-1 일 때 학습 율 을 초기 값 으로 설정 합 니 다.
(2)다 중 간격 조정 학 습 률 MultiStepLR
(1)과 유사 하지만 학습 율 조정의 간격 은 같 지 않 습 니 다.예 를 들 어 epoch=10 시 에 한 번 조정 하고 epoch=30 시 에 한 번 조정 하 며 epoch=80 시 에 한 번 조정 합 니 다.
torch.optim.lr_sheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
인자:milestone(list):하나의 목록 매개 변 수 는 여러 학습 율 을 조정 해 야 하 는 epoch 값 을 나타 낸다.예 를 들 어 milestones=[10,30,80].
다른 매개 변 수 는 같 습 니 다(1).
(3)지수 감쇠 조정 학 습 률 ExponentialLR
학습 율 은 지수 형 감 소 를 나타 내 고 매 훈련 마다 epoch,lr=lrgamma*epoch,즉
torch.optim.lr_sheduler.ExponentialLR(optimizer, gamma, last_epoch)
인자:gamma(float):학습 율 조정 배수 의 밑 수,지 수 는 epoch 이 고 초기 값 은 lr 이 며 배 수 는?
기타 매개 변 수 는 같 습 니 다.
(4)여현 퇴화 함수 학 습 률 조정:
학 습 률 은 코사인 함수 형 으로 감소 하고 2*Tmax 는 여현 함수 주기 이 고 epoch=0 은 여현 형 학 습 률 조정 곡선 에 대응 하 는 epoch=Tmax 코사인 학 습 률 조정 곡선 에 대응 하 는 etamin 곳,epoch>T 에 따라max,학습 율 은 epoch 증가 에 따라 점점 상승 하고 전체 추 세 는 cos(x)와 같 습 니 다.
torch.optim.lr_sheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
인자:T_max(int):학습 율 이 최소 치 로 떨 어 졌 을 때의 epoch 수,즉 epoch=Tmax 시 학습 율 이 코사인 함수 최소 치 로 떨 어 집 니 다.epoch>Tmax 시 학습 율 증가;
eta_min:학 습 률 조정의 최소 값,즉 epoch=Tmax 시,etamin,기본 값 0.
기타 매개 변 수 는 같 습 니 다.
(5)지표 에 따라 학 습 률 을 조정 하여 LRON Plateau 감소
어떤 지표(loss 또는 accuracy)가 최근 몇 개의 epoch 에서 변화 가 없 을 때(주어진 한도 값 을 초과 하거나 낮 출 때)학습 율 을 조정 합 니 다.
만약 에 검증 집의 loss 가 더 이상 떨 어 지지 않 는 다 면 학습 율 을 조정 합 니 다.또는 감사 검증 집의 정확성 이 더 이상 높 아 지지 않 을 때 학 습 률 을 조정 한다.
torch.optim.lr_sheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10,
verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
인자:mode(str):모델 선택 은 min 과 max 두 가지 모델 이 있 습 니 다.min 은 해당 기준 이 더 이상 낮 아 지지 않 는 다 고 표시 합 니 다(예 를 들 어 loss 모니터링).max 는 해당 기준 이 더 이상 높 아 지지 않 는 다 고 표시 합 니 다(예 를 들 어 모니터링 accuracy).
factor(float):학습 율 조정 배수,앞의 gamma 와 측정 기준 이 요구 에 달 할 때 lr=lr×factor。
patience(int):이 지표 가 몇 개의 epoch 변 하지 않 는 것 을 참 으 며 참 을 수 없 을 때 학습 율 을 조정 합 니 다.
verbose(bool):학 습 률 정 보 를 인쇄 할 지 여부,print('Epoch{:5d}group{}을{:.4e}.'format(epoch,i,newlr)이 정 보 를 인쇄 하지 않 는 기본 값 은 False 입 니 다.
threshold_mode(str):기준 이 가장 좋 은 모델 에 달 하 는 지 판단 하 는 두 가지 모델 이 있 습 니 다.rel 과 abs.
thresholdmode==rel,그리고 mode==max 시,dynamicthreshold = best * (1 + threshold);
thresholdmode==rel,그리고 mode==min 시,dynamicthreshold = best * (1 - threshold);
thresholdmode==abs,그리고 mode==max 시,dynamicthreshold = best + threshold;
thresholdmode==abs,그리고 mode==min 시,dynamicthreshold = best - threshold;
threshold(float):thresholdmode 사용.
cooldown(int):"냉각 시간"은 학습 율 을 조정 한 후에 학습 율 조정 전략 을 진정 시 키 고 모델 을 훈련 한 동안 훈련 시 킨 다음 에 모니터링 모델 을 다시 시작 합 니 다.
min_lr(float or list):학습 율 하한 선,float 또는 list 로 여러 매개 변수 그룹 이 있 을 때 list 로 설정 할 수 있 습 니 다.
eps(float):학습 율 이 감소 하 는 최소 치,학습 율 의 변화 치가 eps 보다 적 을 때 학습 율 을 조정 하지 않 습 니 다.
optimizer = torch.optim.SGD(model.parameters(), args.lr,
momentum=args.momentum, weight_decay=args.weight_decay)
scheduler = ReducelROnPlateau(optimizer,'min')
for epoch in range( args.start epoch, args.epochs ):
train(train_loader , model, criterion, optimizer, epoch )
result_avg, loss_val = validate(val_loader, model, criterion, epoch)
# Note that step should be called after validate()
scheduler.step(loss_val )
(6)사용자 정의 학습 율 조정 LambdALR서로 다른 매개 변수 그룹 에 서로 다른 학 습 률 조정 전략 을 설정 합 니 다.규칙 조정:
lr = base_lr * lambda(self.last_epoch)
fine-tune 에서 특히 유용 합 니 다.우 리 는 서로 다른 층 에 서로 다른 학습 율 을 설정 할 수 있 을 뿐만 아니 라 서로 다른 층 에 서로 다른 학습 율 조정 전략 도 설정 할 수 있 습 니 다.
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
인자:lr_lambda(function or list):학습 율 조정 배 수 를 사용자 정의 로 계산 하 는 함수 입 니 다.보통 epoch 의 함수 입 니 다.여러 매개 변수 그룹 이 있 을 때 list 로 설정 합 니 다.
기타 매개 변 수 는 같 습 니 다.
예:
ignored_params = list(map(id, net.fc3.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params, net.parameters())
optimizer = optim.SGD([
{'params': base_params},
{'params': net.fc3.parameters(), 'lr': 0.001*100}], 0.001, momentum=0.9,weight_decay=1e-4)
# Assuming optimizer has two groups.
lambda1 = lambda epoch: epoch // 3
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
train(...)
validate(...)
scheduler.step()
print('epoch: ', i, 'lr: ', scheduler.get_lr())
:
epoch: 0 lr: [0.0, 0.1]
epoch: 1 lr: [0.0, 0.095]
epoch: 2 lr: [0.0, 0.09025]
epoch: 3 lr: [0.001, 0.0857375]
epoch: 4 lr: [0.001, 0.081450625]
epoch: 5 lr: [0.001, 0.07737809374999999]
epoch: 6 lr: [0.002, 0.07350918906249998]
epoch: 7 lr: [0.002, 0.06983372960937498]
epoch: 8 lr: [0.002, 0.06634204312890622]
epoch: 9 lr: [0.003, 0.0630249409724609]
0 ? 。
0.001,
lambda1 = lambda epoch: epoch // 3,
1 epoch , lr = base_lr * lmbda(self.last_epoch),
lr = 0.001 *(0//3) , 1//3 0, 0。
, , 0.1, lr = 0.1 * 0.95^epoch ,
epoch 0 , lr=0.1 , epoch 1 , lr=0.1*0.95。
# -*- coding:utf-8 -*-
''' pytorch '''
__author__ = 'puxitong from UESTC'
import torch
import torch.optim as optim
from torch.optim import lr_scheduler
from torchvision.models import AlexNet
import matplotlib.pyplot as plt
model = AlexNet(num_classes=2)
optimizer = optim.SGD(params=model.parameters(), lr=0.1)
# , step_size epoch,lr*gamma
# scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
# , milestones epoch,lr*gamma
# scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[10, 30, 80], gamma=0.1)
# ,lr*gamma**epoch
# scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
# ,T_max ,lr 0 ,
# epoch=T_max lr , pi/2 , ,lr
# scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=100, eta_min=0)
plt.figure()
x = list(range(100))
y = []
for epoch in range(100):
scheduler.step()
y.append(scheduler.get_lr()[0])
plt.plot(x, y)
plt.show()
2.학습 율 수 동 조정:
def adjust_learning_rate(optimizer, epoch):
"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
lr = args.lr * (0.1 ** (epoch // 30))
for param_group in optimizer.param_groups:
param_group['lr'] = lr
def adjust_learning_rate(epoch, lr):
if epoch <= 81: # 32k iterations
return lr
elif epoch <= 122: # 48k iterations
return lr/10
else:
return lr/100
for epoch in range(epochs):
lr = adjust_learning_rate(optimizer, epoch) #
optimizer = optim.SGD(net.parameters(), lr=lr, momentum=0.9, weight_decay=5e-4)
......
optimizer.step() #
파 람 이 뭐야groups?optimizer param 통과group 에서 매개 변수 그룹 을 관리 합 니 다.paramgroup 에 서 는 매개 변수 그룹 과 그 에 대응 하 는 학습 율,운동량 등 을 저장 합 니 다.따라서 우 리 는 param 을 변경 할 수 있 습 니 다.group[lr]의 값 으로 대응 하 는 매개 변수 그룹의 학습 율 을 변경 합 니 다.
# 1: `param_group` ,len(optim.param_groups)==2
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
# 2:
optim.SGD(model.parameters(), lr=1e-2, momentum=.9)
위의 첫 번 째 예 에서 우 리 는 각각 model.base 와 model.classifier 의 매개 변수 로 서로 다른 학습 율 을 설정 했다.즉,이때 optimizer.paramgrops 에는 두 개의 다른 param 이 있 습 니 다.group:
param_groups[0]: {'params': model.base.parameters()},
param_groups[1]: {'params': model.classifier.parameters(), 'lr': 1e-3}
매개 paramgroup 은 모두 사전 입 니 다.그들 은 공동으로 param 을 구성 합 니 다.groups,그래서 이때 len(optimizer.paramgrops)==2,aijust_learning_rate()함 수 는 for 순환 을 통 해 모든 param 을 꺼 내 는 것 입 니 다.group,그리고 그 중의 키'lr'의 값 을 수정 하여 수 동 으로 학습 율 을 조정 하 는 것 이 라 고 합 니 다.두 번 째 예 에서 len(optimizer.paramgrops)=1,for 순환 을 이용 한 수정 역시 성립 됩 니 다.
매번 교체 할 때마다 실시 간 으로 학습 율 을 인쇄 하려 면 매번 step 에서 업 데 이 트 된 최신 학습 율 을 알 수 있 고 사용 할 수 있 습 니 다.
scheduler.get_lr()
이것 은 학습 율 목록 을 되 돌려 줍 니 다.매개 변수 그룹의 서로 다른 학습 율 로 구성 되 어 있 으 며,목록 색인 을 통 해 서로 다른 매개 변수 그룹의 학습 율 을 얻 을 수 있 습 니 다.PyTorch 에서 학 습 률 감 소 를 설정 하 는 방법(learning rate decay)
많은 경우 에 우 리 는 학습 율(learning rate)을 감소 시 켜 야 한다.아래 의 코드 는 30 개의 epoch 마다 10%의 속도 로 감소 하 는 방법 을 시범 했다.
많은 경우 에 우 리 는 학습 율(learning rate)을 감소 시 켜 야 한다.아래 의 코드 는 30 개의 epoch 마다 10%의 속도 로 감소 하 는 방법 을 시범 했다.
def adjust_learning_rate(optimizer, epoch):
"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
lr = args.lr * (0.1 ** (epoch // 30))
for param_group in optimizer.param_groups:
param_group['lr'] = lr
파 람 이 뭐야groups?optimizer param 통과group 에서 매개 변수 그룹 을 관리 합 니 다.paramgroup 에 서 는 매개 변수 그룹 과 그 에 대응 하 는 학습 율,운동량 등 을 저장 합 니 다.따라서 우 리 는 param 을 변경 할 수 있 습 니 다.group[lr]의 값 으로 대응 하 는 매개 변수 그룹의 학습 율 을 변경 합 니 다.
# `param_group` ,len(optim.param_groups)==2
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
#
optim.SGD(model.parameters(), lr=1e-2, momentum=.9)
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Pytorch는 cpu와 gpu의 사용을 어떻게 전환하는지 상세히 설명합니다.앞에서 말했듯이pytorch에서 서버에 있는 gpu가 점용될 때 우리는 먼저 cpu로 코드를 디버깅하고 싶을 때가 많다. 그러면 gpu와 cpu의 전환이 필요하다. 장치를 가변 매개 변수로 사용하려면argparse를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.