[Boostcamp AI Tech] PyTorch Model save, checkpoints, freezing

재윤·2022년 3월 7일
0

Boostcamp AI Tech

목록 보기
7/9

Model.save()

  • 학습의 결과를 저장하기 위한 함수(우리의 시간은 소중하니까)
  • 모델 형태(architecture)와 파라미터를 저장한다.
  • 모델 학습 중간 과정의 저장을 통해 최선의 결과 모델을 선택
    • 조기멈춤(Early Stopping)과 같은 기술들을 사용할 때, 중간결과들을 체크(checkpoint 사용)해야한다.
  • 만들어진 모델을 외부 연구자와 공유하여 학습 재연성 향상
# Print model's state_dict
print("Model's state_dict:") # state_dict: 모델의파라메터를 표시
for param_tensor in model.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"))

#같은 모델 형태에서 파라미터만 load
new_model = TheModelClass()
new_model.load_state_dict(torch.load(os.path.join(MODEL_PATH, "model.pt")))

# 모델의 architecture와 함께 저장
torch.save(model, os.path.join(MODEL_PATH, "model.pt"))
# 모델의 architecture와 함께 load
model = torch.load(os.path.join(MODEL_PATH, "model.pt"))

Checkpoints

  • 학습의 중간 결과를 저장하여 최선의 결과를 선택
  • 조기멈춤(earlystopping) 기법 사용시 이전 학습의 결과물을 저장
  • loss와 metric 값을 지속적으로 확인 저장
  • 일반적으로 epoch, loss, metric(평가기법 ex) ‘accuracy’)을
    함께 저장하여 확인
  • colab에서 지속적인 학습을 위해 필요
torch.save({
'epoch': e, # 모델의 정보를 epoch과 함께 저장
'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']

Pretrained Learning Transfer Learning

  • 다른 데이터셋으로 만든 모델을 현재 데이터에 적용
  • 대용량 데이터셋으로 만들어진 모델의 성능이 일반적으로 높다.(현재 DL에서 일반적인 기법)
    • 사전 학습된 모델은 방대한 데이터로 이미 학습된 모델이므로 적은 cost로 좋은 성능을 이끌어 내는 것이 가능하다.
  • backbone architecture가 잘 학습된 모델에서 일부분만 변경하여 학습을 수행한다.

NLP는 보통 HuggingFace를 사용한다.(NLP에서는 거의 사실상 표준이라고한다.)

Freezing

  • 잘 알려진 pretrained model을 활용해 마지막부분의 layer만 수정하여 목적에 맞게 다시 모델을 구성하는 방법이다.
  • pretrained model을 활용하려면 모델의 일부분을 frozen 시켜야한다.
  • 특정 위치까지 멈춰서 일부분 파라미터 값이 바뀌지 않게해야한다.
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(): # 마지막 레이어를 제외하고 frozen
	param.requires_grad = False
for param in my_model.linear_layers.parameters():
	param.requires_grad = True

VGG16 Transfer Learning 구현과 CNN 모델과 성능 비교

profile
Naver Boostcamp AI Tech 3기🎈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ㅤㅤ⠀⠀ㅤㅤㅤㅤㅤㅤㅤㅤ2022 데이터분석 청년수련생

0개의 댓글