일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 이진탐색
- python3
- dp
- Level2
- 이코테
- 단계별문제풀이
- 글또
- Level2_PStage
- 구현
- 백준
- 부스트캠프_AITech3기
- 그리디
- 부스트캠프_AITech_3기
- Level1
- 그래프이론
- 프로그래머스
- 주간회고
- mrc
- 알고리즘스터디
- 다시보기
- 알고리즘_스터디
- U_stage
- 파이썬 3
- dfs
- 최단경로
- 정렬
- 개인회고
- 백트랙킹
- ODQA
- 기술면접
- Today
- Total
국문과 유목민
[일일리포트] Day 08 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 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 |