일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 글또
- 구현
- 백준
- Level2
- dp
- U_stage
- python3
- 부스트캠프_AITech_3기
- 기술면접
- 알고리즘스터디
- 주간회고
- mrc
- 그리디
- 프로그래머스
- 개인회고
- dfs
- 최단경로
- Level2_PStage
- 백트랙킹
- Level1
- 단계별문제풀이
- ODQA
- 정렬
- 파이썬 3
- 이진탐색
- 다시보기
- 이코테
- 그래프이론
- 부스트캠프_AITech3기
- 알고리즘_스터디
- Today
- Total
국문과 유목민
[일일리포트] Day 10 본문
▶ Today I Learned (핵심 요약 정리)
Kaggle code 보기
멘토님께서 추천해주신 캐글 내 파이토치 코드를 살펴보면서, 코드의 전체적인 흐름과 눈에 익지 않은 라이브러리나 함수들의 사용법을 익히고자 했다. Kaggle의 데이터 셋은 Natural Language Processing with Disaster Tweets이며, 참고한 코드는 다음과 같다.
- Pytorch text classification : Torchtext + LSTM: TorchText와 LSTM을 활용한 코드로 파이토치의 전체적인 프로세스가 잘 정리되어 있던 것 같다.
- BERT, Huggingface, PyTorch: BERT임베딩과 HuggingfFace를 활용한 코드로서 자연어처리에서 가장 인기있는(?) 두 가지 키워드가 모두 사용되어있다는 점에서 배울게 많았던 코드라고 생각한다.
다음으로 해당 코드를 보면서 잘 몰랐었던 부분이나 새로 알게 된 부분들에 대한 내용입니다. 궁금증을 해결하기 위해서 참고했던 다른 블로그나 사이트의 링크를 간단한 정의와 함께 첨부해서 올린다.
- Class Method & Static Method
- self, cls의 키워드의 차이점은 매소드 타입에 있다. instance 매소드를 사용하면 self 키워드를 사용하고, class 매소드(ClassMethod)를 사용하면 cls 키워드를 사용한다. 클래스 메소드는 클래스 상태를 변경하거나 클래스 레벨에서 동작하는 메소드를 정의할 때 유용합니다.static 매소드는 속성에 접근할 수 없기 때문에 사용하는 키워드가 없습니다.
- StaticMethod: @staticmethod를 명시해서 생성하는 함수. 인스턴스화 하지 않고 메소드를 호출 할 수 있다는 것이 가장 큰 특징이며, static 메소드는 독립적으로 사용되기 때문에 다른 속성에 액세스하거나 해당 클래스 내의 다른 메소드를 호출 할 수 없다.
- ClassMethod: @classmethod를 명시해서 생성하는 함수. class 매소드 또한 static 매소드와 마찬가지로 클래스를 인스턴스화 하지 않아도 호출이 가능하다. 차이점은 다른 메소드 및 클래스 속성에 액세스 할 수있는 기능에 의존하고 있지만, 인스턴스 속성은 없다.
인스턴스 메소드와 클래스 메소드의 비교
class MyClass:
class_variable = 0 # 클래스 변수
def __init__(self, value):
self.value = value
def instance_method(self):
print(f'인스턴스 변수: {self.value}')
@classmethod
def class_method(cls):
print(f'클래스 변수: {cls.class_variable}')
# 인스턴스 생성
obj = MyClass(10)
# 인스턴스 메소드 호출
obj.instance_method() # 출력: 인스턴스 변수: 10
# 클래스 메소드 호출
MyClass.class_method() # 출력: 클래스 변수: 0
[참조링크] Python의 매소드 타입과 cls, self 키워드의 차이
eval()
- evaluation 과정에서 사용하지 않아야 하는 Layer들을 알아서, off시키도록 하는 함수이다. evaluation/validation 과정에서 보통 model.eval()과 torch.no_grad()를 함께 사용한다.
- evaluation 작업이 끝난 후에는 잊지말고. train mode로 모델을 변경해줘야 하는데, 이것은 .train() 함수를 실행시키면 된다.
def train(model, iterator):
epoch_loss = 0
epoch_acc = 0
model.train()
# 생략
def evaluate(model, iterator):
epoch_acc = 0
model.eval()
with torch.no_grad():
# 생략
train_loss, train_acc = train(model, train_iterator)
valid_acc = evaluate(model, valid_iterator)
[참조링크] model.eval() 의미
torch.manual_seed(seed)
- 파이토치에서 random seed를 고정하기 위해 사용하는 메소드
멘토링 정리
import math
# mnist_resnet18 분류 모델을 학습하기
MNIST_CLASS_NUM = 10
mnist_resnet18.fc = torch.nn.Linear(in_features=512, out_features=MNIST_CLASS_NUM, bias=True) # resnet18.fc의 in_features의 크기는? 512 이를 10으로 바꿔줘야 한다.
torch.nn.init.xavier_uniform_(mnist_resnet18.fc.weight) # ← 해당 부분 질문
stdv = 1.0 / np.sqrt(512)
mnist_resnet18.fc.bias.data.uniform_(-stdv, stdv)
Q1. xavier_uniform을 하는 이유와 분산을 왜 output layer의 input값으로 나눠줘야 하는지?
A. xavier_uniform을 weight에 적용하는 것을 weight_initialize라고 한다. 이를 하는 이유는 정규분포로 계산을 하게 되면, 계산 결과의 분산이 커지기 때문이라고 한다. 그리고 1/np.sqrt(input_size) 를 하는 이유는 들어오는 값이 커지면 이에 따라 분산이 커지기 때문에 값을 줄이기 위해서 나눠준다고 한다.
Q2. optimizer를 Adam으로 사용하는 이유
A. Weight 업데이트를 위해서 optimizer를 사용하는데, 그 중에서 Adam이 자주 사용되는 것뿐이지 다른 optimizer도 사용될 수 있다고 한다.
Q3. tqdm 변수 출력하는 방법
A. tqdm을 with ~~ as tqdm변수명로 정의하고, 안에서 set_desciption(f"String{epoch}") 처럼 구현한 후 for문을 새로만든 변수로 설정하면 된다.
Q4. 하이퍼파라미터 튜닝을 하나만 한다고 했을 때 어떤 하이퍼파라미터를 선택할 지?
A. Epoch는 early stop이 있다면, Batch사이즈를 선택하는게 괜찮을 것 같다. 왜냐하면, 배치는 배치 사이즈에 영향을 받는 모델들이 종종 있기 때문이다.
Q5. Train/Valid/Test 셋을 나누는 이유
A. 보통 Train은 모델 학습, Valid는 하이퍼파라미터 세팅에 사용하고, Test는 최종평가를 하는데 사용한다. Valid데이터셋의 경우 하이퍼파라미터 세팅에 사용되면 이 자체로 모델 학습 단계에 관여를 한 것이기 때문에, Valid데이터셋을 이용해 모델 평가를 진행하면 안 된다. 따라서 최종 모델 평가를 하기 위해 Test 데이터셋까지 나눌 필요가 있다.
별도로 배운 내용
- Bag of Tricks: 딥러닝에서 사용되는 “이름 없는 트릭”들이 있는데, 이렇게 학습에 도움을 주는 트릭을 모아서 집대성하고 분석한 논문이 있다. AWS(Amazon Web Services)에서 발표한 Bag of Tricks라는 논문이다.
- Embedding: 자연어처리 분야에서 임베딩이란, 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 일련의 과정 전체를 의미한다. 단어나 문장 각각을 벡터로 변환해 벡터 공간으로 끼워넣는다(embed)는 의미에서 임베딩이라는 이름이 붙었다.
▶ Review (생각)
오늘은 기존 강의나 과제를 정리하는 것도 좋지만, 모처럼 생긴 시간이기도 했고 추후 스페셜 피어세션, 피어세션, 마스터 클래스, 멘토링까지 예정되어 있어서 간단히 할 수 있는 것을 생각했다. 그래서 과제를 풀면서 헷갈렸던 부분 중 멘토님에게 여쭤볼만한 부분을 정리하고, 멘토님이 추천해주셨던 캐글 베이스라인 코드를 봤다. 신기했던 것은 다른 사람들이 짠 코드를 보면서 어느정도 이해를 할 수 있었다는 것이다. 종종 익숙하지 않은 함수들이나 프로세스 등의 경우 검색을 통해서 부족한 부분을 보충했다. 그렇게 주석없이 코드를 보면서 흐름에 대해서 더 이해할 수 있었던 것 같다. 또한 추천해주셨던 책(한국어 임베딩)에 대해서도 볼 수 있는 시간이 있어서 1강을 봤는데, 헷갈렸던 개념들을 잡을 수 있었고 가독성이 좋아서 쉽게 읽을 수 있었다. 시간이 날 때마다 읽어두면 강의를 따라가는데 도움이 될 것 같다는 생각을 했다.
부스트캠프를 진행하면서 공부하는 방법과 방향을 익힐 수 있는 것 같아서 좋은 것 같다. 만약 혼자서 공부를 했다면 맞는 방향이라고 할 지라도 마음을 잡을 때까지 시간이 걸렸을 것 같은데, 괜찮은 방향, 좋은 방향 등을 제시해주고 생각해볼 수 있는 방법 등을 제시해주기 때문에 수월한 것 같다.
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[일일리포트] Day 11 (Matplotlib) (0) | 2022.02.03 |
---|---|
[2주차] 학습 정리 및 회고 (1) | 2022.01.28 |
[일일리포트] Day 09 (0) | 2022.01.26 |
[일일리포트] Day 08 (0) | 2022.01.26 |
[일일리포트] Day 07 (0) | 2022.01.25 |