국문과 유목민

[일일리포트] Day 08 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 08

논곰 2022. 1. 26. 22:48

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

피어세션 (과제 1정리)

 2주차 과제를 풀고 팀원들과 피어세션을 가지면서 이전에 생각해보지 못했던 부분들을 더 찾아보고, 조금 더 이해하게 된 부분이 있었다. 개념을 이해할 때 도움이 됐던 사이트의 링크를 남겨본다.

  • Hook: Hook의 경우 모듈, 텐서 등에 따라서 사용할 수 있는 hook 메소드가 달라지고, foward, backward, pre_forwrad 등 한 번에 많은 개념을 배우다보니 개념이 섞였던 것 같다. 나처럼 헷갈리는 내용이 있다면 아래 포스팅을 보면 hook에 대해 조금 더 잘 이해할 수 있을 것이라고 생각한다. 
    • register_forward_hook: forward 호출 후 output 계산 후에 걸리는 hook
    • register_forward_pre_hook: forward 호출 전에 걸리는 hook
    • register_full_backward_hook[in module]: module input에 대한 gradient가 계산될 때마다 호출되는 hook 
    • register_hook [in Tensor]: Tensor의 경우 backward hook만 사용할 수 있다. gradient를 바꿀 수는 없지만 새로운 grad를 생성해 기존 grad를 대신해 사용할 수 있다.  

[참조 링크] https://daebaq27.tistory.com/65

 

  • requires_grad, zero_grad(), no_grad(): grad에 관해 자주 등장하는 변수 및 메소드인데, 나는 잘 모르는데 마치 당연하다는 듯이 사용하고 있는 것 같아서 찾아봤다. 아래 포스팅을 보고 나면, 해당 변수 및 메소드를 수월하게 이해할 수 있을 것이라고 생각한다. 
    • requires_grad = True/False: True로 설정하면 backprop 중에 해당 Tensor들에 대한 변화도를 계산하라는 의미이며, 계산한 변화도는 Tensor 내에 저장된다. 당연히 False는 변화도를 계산할 필요가 없다는 뜻이다.
    •  zero_grad(): Neural Network model 인스턴스를 만든 후, 역전파 단계를 실행하기 전에 변화도를 0으로 만든다. 왜냐하면 .backward()를 호출할 때마다 변화도가 buffer에 누적이 되며 이후 연산에 영향을 줄 수 있기 때문이다.
    • no_grad(): 해당 블록을 history 트래킹 하지 않겠다는 뜻이다.
    • (추가) retain_grad(): Tensor에 Gradient가 grad에 저장되게 하고 싶으면, 해당 Tensor의 retain_grad()를 호출해서 retains_grad를 True로 설정하고, backward()를 호출하면 grad에 저장된다. [참조 링크]

 [참조 링크] https://green-late7.tistory.com/48

 Transfer Learning

  • Transfer Learning: 이미 학습된 모델을 가져와서 재학습하는 방법
    • model.save(): 학습의 결과를 저장하기 위한 함수, 모델 형태나 파라메터를 저장할 수 있으며, 모델 학습 중간중간 저장을 통해 최선의 결과 모델을 선택할 수 있다.
    • checkpoints: 학습의 중간 결과를 저장할 때 사용하는 방법이며, earlystopping기법 사용 시 이전 학습의 결과물을 저장한다. loss와 metric 값을 지속적으로 저장할 수 있으며 일반적으로 epoch, loss, metric을 함께 저장해 확인한다. (Colab 사용한다면 꼭 필요!!)
    • PretrainedModel Transfer Learning: 다른 데이터셋으로 미리 학습된 모델을 현재 데이터에 적용하는 방법이며, 현재 DL에서 가장 일반적으로 사용되는 학습 기법이다. backbone architecture가 잘 학습된 모델에서 일부분만 변경해서 학습을 수행할 수 있다.
    • Freezing: pretrained model 활용 시 모델의 일부분을 frozen시키는 방법. 이렇게 해야 기존에 학습된 모델을 사용하되 일부만 변경시켜서 output size를 맞출 수 있다.
  • 코드 내 알아두면 좋은 함수들 (하단 코드는 함수의 사용법 및 설명 위주로 참고)
class TheModelClass(nn.Module):
	pass
# model initialize
model = TheModelClass().cuda()
# optimizer initialize
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)

# state_dict: 모델의 파라미터 표시
print("Model's state_dict:")
for param_tensor in model.state_dict():
    print(param_tensor, "\t", model.state_dict()[param_tensor].size())
    
# 모델 정보를 Keras형태로 보여준다.
from torchsummary import summary
summary(model, (3, 224, 224))

# 모델 저장 (파라미터만)
MODEL_PATH ="saved"
if not os.path.exists(MODEL_PATH):
    os.makedirs(MODEL_PATH)
torch.save(model.state_dict(),
           os.path.join(MODEL_PATH, "model.pt"))

# 모델 로드 (파라미터만)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

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

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

[참조 링크] https://pytorch.org/tutorials/beginner/saving_loading_models.html

 

Pretrain과정

파이토치 모델은 아래와 같은 프로세스를 거쳐서 학습이 진행된다.(코드를 전체적으로 훑는게 제일 좋다)

1. pretrain모델 로드                vgg = models.vgg16(pretrained=True).to(device)
2. pretrain모델 일부 변경           vgg.classifier._modules['6'] = torch.nn.Linear(4096, 1)
3. pretrain모델 이용해서 모듈 생성   def __init__(self): ~ self.vgg19 = models.vgg19(pretrained=True)
4. Dataset 생성                     dataset = datasets.ImageFolder()
5. HyperParameter 설정              EPOCHS, BATCH_SIZE, LearningRate = 100, 64, 0.001
6. DataLoader 생성                  dataloader = torch.utils.data.DataLoader(dataset,
7. Layer Frozen                     param.requires_grad = True
8. loss 및 optimizer 생성           nn.BCEWithLogitsLoss(), optim.Adam(param, lr=LearningRate)
9. epoch 진행                       for e in range(1, EPOCHS+1):

TensorBoard_wandb

  • Tensorboard: TensorFlow의 프로젝트로 만들어진 시각화 도구이며, scalar, graph, histogram, image, mesh 등의 학습 결과를 시각화 할 수 있게 도와주는 도구이다.
  • wandb(WeightAndBias): 머신러닝 실험을 지원하기 위한 상용도구로, 협업이나 실험결과 기록, 코드 Versioning 등을 제공한다. MLOps의 대표적인 도구이지만 계정을 연결해서 사용해야 한다.

▶ Review (생각)

 오늘은 강의 2챕터를 듣고, 과제를 다 끝내고 이러다보니 시간이 정말 순식간에 지나간 것 같다. 특히 2번째 과제를 하면서 예상하지 못했던 부분에서 계속 오류가 나서 시간을 많이 썼는데, 결국 내가 작성한 코드가 아닌 다른 부분에서 발생한 에러였다. 해당 문제 때문에 거의 2시간을 썼던 것 같은데 팀이 아니었다면 더 오래걸렸을 것 같기도 하다. 

 

 피어세션을 진행하면서 오늘 여러가지 알게 된 정보를 추가적으로 정리했다. 동료와 같이 학습을 하면서 내가  지나갔던 부분들을 다시 한 번 보게 되는데, 그 과정에서 대충 알았던 부분들을 더 확실히 알게 되는 것 같다. 그리고 내가 생각하지 못했던 부분들에 대해서도 찾아보고 정리할 수 있는 부분도 좋은 것 같다. 오늘도 hook이나 grad 부분 같은 경우에 그렇구나하고 넘어갔다면 나중에 헤맸을 것 같은데, 질문이 들어와서 찾다보니 더 잘 알게 된 것 같다. 

 

 이번 주 강의는 과제에 힘이 좀 실려있어서 상대적으로 난이도가 괜찮다고 느껴지기는 하는 것 같다. 하지만 그 와중에도 pretrain 과정은 기억하는게 좋을 것 같아 전체 코드를 싣지는 못해도 프로세스를 정리해서 올렸는데 뭐 나름 괜찮은 것도 같다. Model 시각화 도구의 경우 추후에 필요하게 될 경우 참고하면 될 것 같아서 정리를 상대적으로 간단하게 했다. 

'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글

[일일리포트] Day 10  (0) 2022.01.28
[일일리포트] Day 09  (0) 2022.01.26
[일일리포트] Day 07  (0) 2022.01.25
[일일리포트] Day 06  (0) 2022.01.24
[1주차] 학습 정리 및 회고  (0) 2022.01.21
Comments