[D+8] Data & Model 저장과 불러오기

siwoo·2023년 11월 15일
0

(1) 🐰 데이터 불러오기

대용량 데이터를 불러올 때는 효율성을 감안했을 때 Dataloader를 사용하는 것이 좋다.

torch에서 제공하는 기본 Dataloader를 그대로 사용하는 것도 좋지만 때로는 자신이 보유한 데이터의 처리 방식 차이에 따라 상속받은 클래스를 따로 정의해줄 수도 있다.

dataloader를 사용하기 전에는 dataset도 정의되어야 한다.

dataset을 통해 전체 데이터 셋을 정의하고 dataloader를 이용해 전체 데이터로부터 배치 사이즈만큼의 데이터를 뽑아오는 방식이다.

  1. dataset

torch.utils.data.Dataset 클래스를 상속받는다.

필수적으로 정의되어야 할 기본 메서드는 __init__, __len__, __getitem__ 이렇게 3가지 이다.

__init__: 데이터 위치, 데이터 컬럼명, 클래스 명 등 필요한 기본 변수를 초기화한다.

__len__: 데이터의 개수를 반환한다.

__getitem__: 데이터셋의 idx번째 데이터를 반환하는 데에 사용한다. 이때 idx는 정수로 구성된다.

  1. dataloader

torch.utils.data.DataLoader 클래스를 상속하여 자신만의 dataloader를 정의할 수 있다.

DataLoader에는 collate_fn이라는 변수에 함수를 넣어 반환할 데이터에 변형을 줄 수 있다.

(2) 🍹모델 불러오기

최근 딥러닝 모델을 산업에서 적용할 때 나타나는 양상은 다음과 같다.

  1. 학습 대상 데이터의 타입이 유사하면서 대용량 데이터에 대해 학습한 모델을 가져온다.
  2. 그 모델을 갖고 있는 데이터로 further learning 시킨다.

대표적으로는 이미지 분야에서는 imageNet, 자연어 처리 분야에서는 BERT 모델이 바로 1번에서 말한 예시에 해당하는 대용량 데이터를 잘 학습한 모델로 알려져 있다.

모델을 학습시킬 때 데이터 크기에 따라 학습 시간 자체가 상당히 오래 걸리기 때문에 모델을 학습시키고 잠이 들기도 한다.

💥 그렇다면 이때 학습한 결과를 영구적으로 저장해둘 수 있는 툴이 있을까?
YES

  • torch.save(obj)
    • model 그 자체(형태와 파라메터)를 저장하고 싶은 경우
      obj = model
    • model의 파라메터만 저장하고 싶은 경우
      obj = model.state_dict()
    • model의 중간 연산 결과를 저장하고 싶은 경우
      학습 epoch마다 딕셔너리 형태로 저장하고 싶은 것을 지정한다.
        obj = {
        'epoch': i, 
        'loss': loss,
        'val_loss': val_loss,
        'optimizer_state_dict': optimizer.state_dict()}
    • 위와 같이 설정하여 학습하는 과정과 결과를 저장할 수 있다.

이렇게 저장한 모델은 불러오는 방법은 간단하다.😊

# model이 저장된 경로를 복사해서 붙여넣기 한후 모델의 이름과 확장자명까지 붙여주기
torch.load(model)

🏈 추가 팁

  1. 모델의 중간 연산 결과를 저장하는 이유는 모델이 overfitting을 하는 경우 등 모델이 최종 성능이 중간 성능보다 못할 수 있기 때문이다. 따라서 이를 저장하여 추후에 파라메터 설정에 반영한다.

  2. model의 확장자 pt vs pth?

    • pth는 python path와 충돌이 생길 위험이 있기 때문에 pt를 권장한다.

0개의 댓글