from tqdm import tqdm
for i in tqdm(range(100), desc="Text", leave = True):
time.sleep(0.1)
with tqdm(total=100) as pbar:
for i in range(10):
time.sleep(0.1)
pbar.update(10)
import torch.optim as optim
optimizer.step()
으로 학습 값을 적용시키고, scheduler.step()을 활용하여 Learning Rate를 Epoch마다 바꿔줌for epoch in range(args.epochs):
model.train()
matches = 0
for idx, train_batch in enumerate(train_loader):
inputs, labels = train_batch
optimizer.zero_grad()
outs = model(inputs)
preds = torch.argmax(outs, dim=-1)
loss = criterion(outs, labels)
loss.backward()
optimizer.step()
# Train시켜 Parameter를 Update시킴
# 이걸 해줘야 Scheduler도 Update 됨
scheduler.step()
# Optimizer가 다음 Epoch에서 활용할 Learning Rate로 바꿔주는 부분
def visualize_scheduler(optimizer, scheduler, epochs):
lrs = []
for _ in range(epochs):
lrs.append(optimizer.param_groups[0]['lr'])
scheduler.step()
# 학습 과정이 없으므로 Optimizer.step()은 생략해도 됨
plt.plot(lrs)
plt.show()
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma)
epochs = 300
optimizer = optim.SGD([torch.tensor(1)], lr=0.1, momentum=0.9)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5)
visualize_scheduler(optimizer, scheduler, epochs)
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min)
epochs = 300
optimizer = optim.Adam([torch.tensor(1)], lr=0.1)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, \
eta_min=0)
visualize_scheduler(optimizer, scheduler, epochs)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, \
eta_min=0)
visualize_scheduler(optimizer, scheduler, epochs)
# 위 그래프가 T_max = 10, 아래 그래프가 T_max = 20인 그래프
# T_max = 20일 때 총 Iteration이 줄어들었음을 알 수 있다.
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode)
"""
먼저, ReduceLROnPlateau는 Metric을 전달해야 함을 알고 있자
scheduler.step()에 Metric을 Parameter로 입력해줘야 하므로, 임의로
scheduler.step(1)로 전달해줬다.
"""
epochs = 200
optimizer = optim.Adam([torch.tensor(1)], lr=0.1)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',\
factor=0.5, patience=20)
visualize_scheduler(optimizer, scheduler, epochs)
"""
사실상 항상 Metric이 1이므로 성능 향상은 이뤄지지 않는다.
patience=20으로 설정했으므로, 20 Epoch마다 lr Update가 이뤄질 것이다.
아래 그래프를 보면, 실제로 20 Epoch 주기로 lr이 Update됨을 볼 수 있다.
"""
!pip install pytorch-ignite
: Pytorch Ignite 설치from ignite.handlers.param_scheduler import create_lr_scheduler_with_warmup
: Warm-up 설정을 위한 Module importmodel = models.resnet18()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5)
lr_scheduler = create_lr_scheduler_with_warmup(scheduler,
warmup_start_value=0.0,
warmup_duration=3,
warmup_end_value=1e-3)
"""
위에서 우리가 optim.lr_scheduler를 통해 설정해 준 lr Scheduler를
create_lr_scheduler_with_warmup에 먹여주는 방식으로 Warmup Scheduler를 활용
할 수 있다
warmup_start_value ~ warmup_end_value까지, warmup_duration만큼
선형적으로 증가시킨 뒤에 내가 지정한 lr_scheduler를 적용시킴
위에서는 0.0 ~ 1e-3까지 증가한 뒤 StepLR Scheduler가 실행될 것이다.
"""
lrs = []
lr_scheduler(None)
# 위 방식으로 진행하면 0.1 -> 0.0 -> ... -> 1e-3으로 lr이 변화된다.
# 즉, 초기 Optimizer의 learning Rate부터 출력되므로, 이 값을 버리기 위한 과정
for _ in range(100):
lrs.append(optimizer.param_groups[0]['lr'])
lr_scheduler(None)
plt.plot(lrs)
plt.show()
pip install timm
model = timm.create_model('{원하는 모델}', pretrained=True)
model = timm.create_model('{원하는 모델}', pretrained=True,\
num_classes={Output Features})
pip install optuna
Optuna는 Metric과 Train 과정을 모두 인자로 전달해주는 목적 함수가 필요
목적 함수 예시
def objective(trial):
model = ConvNet(trial).to(DEVICE)
# Optimizer Setting
optimizer_name = trial.suggest_categorical("optimizer",\
["Adam", "Adadelta","Adagrad"])
lr = trial.suggest_float("lr", 1e-5, 1e-1,log=True)
optimizer = getattr(optim, optimizer_name)(model.parameters(), lr=lr)
# optim에 Optimizer_name을, lr에 내가 지정했던 lr을 적용하는 구간
# 이렇게 내가 원하는 후보군들을 적용하여 optimizer로 넘겨줌
# optimizer는 특정 1개로 지정된 것이 아닌 후보 여러개가 존재하고 있는 상태
batch_size=trial.suggest_int("batch_size", 64, 256,step=64)
criterion=nn.CrossEntropyLoss()
# Get the MNIST imagesset.
train_loader, valid_loader = get_mnist(train_dataset,batch_size)
# Training of the model.
for epoch in range(EPOCHS):
model.train()
for batch_idx, (images, labels) in enumerate(train_loader):
images, labels = images.to(DEVICE), labels.to(DEVICE)
optimizer.zero_grad()
output = model(images)
loss = criterion(output, labels)
loss.backward()
optimizer.step()
# Validation of the model.
model.eval()
correct = 0
with torch.no_grad():
for batch_idx, (images, labels) in enumerate(valid_loader):
images, labels = images.to(DEVICE), labels.to(DEVICE)
output = model(images)
pred = output.argmax(dim=1, keepdim=True)
correct += pred.eq(labels.view_as(pred)).sum().item()
accuracy = correct / len(valid_loader.dataset)
trial.report(accuracy, epoch)
# Handle pruning based on the intermediate value.
if trial.should_prune():
raise optuna.exceptions.TrialPruned()
return accuracy
<목적 함수에서 활용된 여러 가지 변수 설정 방법>
if trial.should_prune():
raise optuna.exceptions.TrialPruned()
import optuna
study = optuna.create_study(direction='maximize')
study.optimize({목적 함수}, n_trials)
study.optimize(objective, n_trials=20)
으로 활용 가능study.best_trial
study.trials
study.trials_dataframe()
을 통해 DataFrame형식으로 변환하여 결과값을 반환할 수도 있음trial.value
trial.params
optuna.visualization.plot_optimization_history(study)
optuna.visualization.plot_contour(study, params=['batch_size', 'lr'])
optuna.visualization.plot_parallel_coordinate(study)
fig = optuna.visualization.plot_slice(study, params=["x", "y"])
optuna.visualization.plot_param_importances(study)
from torch.utils.data import random_split
train_data, val_data = random_split(train_dataset,\
[int(m-m*0.2), int(m*0.2)])
이미지 출처
https://optuna.readthedocs.io/en/stable/reference/visualization/generated/optuna.visualization.matplotlib.plot_slice.html
https://ichi.pro/ko/optunalo-pytorch-haipeopalamiteo-jojeong-4883072668892