공부 기록
[WEEK 2] PyTorch 구조 학습하기 2 본문
▶ model.save()
- 학습의 결과를 저장하기 위한 함수이다.
- 학습의 결과를 2가지 방법으로 저장할 수 있다.
- 모델의 형태(architecture)를 저장할 수 있다.
- 형태 안에 있는 파라미터만 저장할 수 있다.
- 모델 학습 중간 과정의 저장을 통해 최선의 결과 모델을 선택할 수 있다. → early stopping
- 만들어진 모델을 외부 연구자와 공유하여 학습 재연성을 향상할 수 있다.
for param_tensor in model.state_dict(): # state_dict : 모델의 파라미터를 표시해주는 함수 -> OrderedDict 타입
print(param_tensor, "\t", model.state_dict()[param_tensor].size())
torch.save(model.state_dict(), os.path.join(MODEL_PATH, "model.pt")) # 모델의 파라미터 저장
new_model = TheModelClass() # 동일한 모델, 코드여야 함
new_model.load_state_dict(torch.load(os.path.join(MODEL_PATH, "model.pt"))) # 같은 모델의 형태에서 파라미터만 load
torch.save(model, os.path.join(MODEL_PATH, "model.pt")) # 모델의 architecture와 함께 저장
model = torch.load(os.path.join(MODEL_PATH, "model.pt")) # 모델의 architecture와 함께 load
▶ checkpoints
- 학습의 중간 결과를 저장하여 최선의 결과를 선택할 수 있다.
- earlystopping 기법 사용시 이전 학습의 결과물을 저장한다.
- loss와 metric 값을 지속적으로 확인할 수 있도록 저장한다.
- 일반적으로 epoch, loss, metric을 함께 저장하여 확인할 수 있도록 한다.
- colab에서 지속적인 학습을 위해서 반드시 필요하다.
torch.save({
'epoch':e,
'model_state_dict':model.state_dict(),
'optimizer_state_dict':optimizer.state_dict(),
'loss':epoch_loss,
},
f"saved/checkpoint_model_{e}_{epoch_loss/len(dataloader)}_{epoch_acc/len(dataloader)}.pt")
checkpoint = torch.load(PATH)
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']
▶ Transfer learning
- 다른 데이터셋으로 만든 모델(이미 만들어 놓은 모델, pretrained model)을 가지고 현재 데이터에 적용하는 것이다.
- 일반적으로 대용량 데이터셋으로 만들어진 모델의 성능이 좋다.
- 현재의 DL에서는 가장 일반적인 학습 기법이다.
- backbone architecture가 잘 학습된 모델에서 일부분만 변경하여 보통 학습을 수행한다.
- TorchVison은 다양한 기본 모델을 제공한다.
- NLP는 HuggigFace가 사실상 표준 모델처럼 사용된다.
▶ Freezing
- pretrained model을 활용 시 모델의 일부분을 frozen 시키는 것이다.
- frozen : 특정 부분의 파라미터 값을 바뀌지 않게 하는 것
- back propagation이 일부 layer에만 일어나도록 한다.
vgg = models.vgg16(pretrained=True).to(device) # vgg16모델을 vgg에 할당하기
class MyNewNet(nn.Module): # 내 모델 만들기
def init (self):
super(MyNewNet,self).__init ()
self.vgg19 = models.vgg19(pretrained=True)
self.linear_layers=nn.Linear(1000,1) # 모델의 마지막 Linear Layer 추가
#Defining the forward pass
def forward(self, x):
x = self.vgg19(x)
return self.linear_layers(x)
for param in my_model.parameters(): # 마지막 layer를 제외하고 frozen
param.requires_grad=False
for param in my_model.linear_layers.parameters():
param.requires_grad = True
- 긴 학습 과정에서 기록은 반드시 필요하다.
- 기록하는 방법을 생각해보면 print, log, csv 파일 형태 등등이 있다.
- 딥러닝 공부해보면 알 수 있듯이 기록하기 좋은 도구들이 많다. → Tensorboard, weight & biases(wandb)
▶ Tensorboard
- TensorFlow의 프로젝트로 만들어진 시각화 도구이다.
- 학습 그래프, metric, 학습 결과의 시각화를 지원한다.
- PyTorch도 연결 가능하다. → DL 시각화의 핵심 도구
- scalar : metric 등 상수값의 연속(epoch)을 표시 → 평가지표(accuracy, loss, precision, recall 등)를 epoch(시간) 단위로 표시
- graph : 모델의 computational graph 표시
- histogram : weight 등 값의 분포를 표현
- Image, Text : 예측 값과 실제 값을 비교 표시
- mesh : 3d 형태의 데이터를 표현하는 도구
import os
# Tensorboard 기록을 위한 directory 생성
# directory name : "프로젝트 이름/실험 이름"과 같이 생성
logs_base_dir = "logs"
os.makedirs(logs_base_dir, exist_ok=True)
from torch.utils.tensorboard import SummaryWriter
import numpy as np
# 기록 생성 객체 SummaryWriter 생성
writer = SummaryWriter(logs_base_dir)
for n_iter in range(100):
writer.add_scalar('Loss/train', np.random.random(), n_iter)
writer.add_scalar('Loss/test', np.random.random(), n_iter)
writer.add_scalar('Accuracy/train', np.random.random(), n_iter)
writer.add_scalar('Accuracy/test', np.random.random(), n_iter)
writer.flush() # 값 기록(disk에 쓰기)
# add_scalar 함수 : scalar 값을 기록
# Loss/train : loss category에 train에 넣기
# n_iter : x 축의 값
# Tensorboard 띄우는 방법
%load_ext tensorboard # jupyter, colab에서 바로 사용 가능
%tensorboard --logdir {logs_base_dir} # 6006포트로 자동 생성
▶ weight & biases
- 머신러닝 실험을 원활히 지원하기 위한 상용도구이다.
- 협업, code versioning, 실험 결과 기록 등을 제공한다.
- MLOps의 대표적인 툴로 저변 확대 중이다.
!pip install wandb -q
# config 설정
config={"epochs": EPOCHS, "batch_size": BATCH_SIZE, "learning_rate" : LEARNING_RATE}
wandb.init(project="my-test-project", config=config)
# wandb.config.batch_size = BATCH_SIZE
# wandb.config.learning_rate = LEARNING_RATE
for e in range(1, EPOCHS+1):
epoch_loss = 0
epoch_acc = 0
for X_batch, y_batch in train_dataset:
X_batch, y_batch = X_batch.to(device), y_batch.to(device).type(torch.cuda.FloatTensor)
#...
optimizer.step()
#...
wandb.log({'accuracy': train_acc, 'loss': train_loss}) # 기록 add_~~~ 함수와 동일
※ 모든 시각 자료는 부스트 캠프 AI Tech 교육 자료를 참고했습니다.
'BOOST CAMP - AI Tech' 카테고리의 다른 글
[WEEK 3] 딥러닝 기본 (0) | 2022.10.03 |
---|---|
[WEEK 2] PyTorch 활용하기 (0) | 2022.09.29 |
[WEEK 2] PyTorch 구조 학습하기 (0) | 2022.09.27 |
[WEEK 2] PyTorch 기본 (0) | 2022.09.26 |
[WEEK 1] AI Math - 딥러닝 학습 방법 (0) | 2022.09.25 |
Comments