2021년 4월 1일 목요일

AITech P-stage1 [Day 4] data imbalance..

 

=====================================

수업내용



loss 도 사실 nn.Module 클래스. 그래서 layer처럼 되는거고, 자기가 원하는 식으로 만들 수도 있다. loss.backward()를 하면 require_grad=True 인 것들에 대해 loss layer에서 부터의 변화량 만큼 학습시키는 거임.


근데 loss도 그냥 loss를 하는것 보다는 여러 상황을 고려해서 하는게 더 낫더라. 해서 나온 여러 loss 방법들. 식을 잘 정의하면 고려할 수 있나보다.




optimizer는 이 loss로 구한 error만큼 움직이긴 할 건데 어떻게 움직일거냐 하는걸 결정함.

학습중에 learning rate를 감소시킬 순 없을까? 해서 나온것들이 몇개 있음.





https://www.kaggle.com/isbhargav/guide-to-pytorch-learning-rate-scheduling/log





Metric은 실제 모델을 deploy할 때 성능평가.


모델 훈련시킬 때 model.train() 해서 안에 들어있는 dropout과 batchnorm을 활성화 시킨다고 해놓고 훈련한다.

이제 훈련시킬 때 사용하는 optimizer.zero_grad(), criterion, optimizer.step()을 보자.


zero_grad는 각 파라미터 안에 전에 미분했던 값이 들어있을 텐데 그걸 초기화 시켜주는 것. 이걸 안하면 돌았을 때 전에 들어있던 미분값이랑 새로 나온 미분값이랑 더해진다. 이걸 이용할 수도 있다.



loss도 chain에 넣어줌으로써 각 layer parameter에 대한 loss layer의 미분값을 구할 수 있는 것.

 

chain으로 연결되어 있다고 했던게 이런 거. 그래서 이걸 거슬러 올라기기만 하면 된다.


step() 을 사용해서 이렇게 저장된 미분값들을 반영해줘서 update. 업데이트 방법은 optimizer에서 정의하니까 optimizer.step() 이다.

이렇게 과정을 알았으면 응용도 가능하다.


각 batch마다 학습시키는게 아니라 2번씩 쌓아서 학습시키는거.


이렇게 학습시키면 테스트하는 eval 과정도 거쳐야 하는데, model.eval()로 하거나 매번 하는게 불편하면 with torch.no_grad()로 하면 된다.


이게 검증이지.


모델 저장하는건 그냥 하면 된다. 결과를 csv에 넣어서 제출하는것도..

https://www.pytorchlightning.ai/

이 모든게 힘들고 귀찮으니까 keras처럼 간단하게 만드는 pytorch lightning이라는 프로젝트가 진행중이지만 내부를 알아야 활용이 되니까.


======================

피어세션

resnet 78% 나옴

valid를 사람 별로 나눠보자

efficient net d1 72%

모델을 나눠서 해보기?

optimizer에서 papers의 madgrad


def seed_everything(seed: int = 42):

    random.seed(seed)

    np.random.seed(seed)

    os.environ["PYTHONHASHSEED"] = str(seed)

    torch.manual_seed(seed)

    torch.cuda.manual_seed(seed)  # type: ignore

    torch.backends.cudnn.deterministic = True  # type: ignore

    torch.backends.cudnn.benchmark = True  


===============================

목표

가끔 학습이 잘 안되고 valid data에 대한 accuracy가 0으로 나오는 이유 분석하기, 해결법 찾기, 각 클래스에 대한 모델을 따로 만들어 앙상블 해보기


=============================

행동

일단 0으로 나오는 이유는 코드가 문제가 아니라 데이터 양이 imbalance해서 그런 것이라는걸 알아냈다. 즉 label 4가 제일 많아서 4로 overfitting 훈련된다.

그래서 문제는 데이터 불균형이고 이를 해결하는 방법이 Focal loss라고 한다. 그래서 지금 https://catalyst-team.github.io/catalyst/_modules/catalyst/contrib/nn/criterion/focal.html#FocalLossMultiClass 여기서 돌리고 있는데 잘 되는 것 같다. 문제는 코드를 봐도 원리를 모르겠어서 좀 더 뜯어봐야 할듯. 원래는 catalyst 의 Focal loss말고 balanceclasssampler랑 dynamicbalanceclasssampler 를 보고 이름과 설명 단어좀 보면 데이터 불균형을 알아서 잘 분배해서 학습시키는게 가능하게 하는 걸까? 해서 여러가지 해봤는데 사용법을 아직도 잘 모르겠다. 일단 balanceclassampler는 임의의 list를 넣으면 되는거라 사용하기 쉬울 것 같은데 dynamicbalanceclasssampler는 넣기도 좀 복잡하고 잠깐 해봤는데도 내가 생각한대로 행동을 안해서 좀 더 사용법을 찾아보거나 해야 할듯. 예시도 안나온단 말이야.

그리고 앙상블 이런건 딴짓하느라 못했다.

처음 움직이는 방향으로 결정이 너무 크게 나니 lr를 0.0001로 했더니 어느정도 되는 것 같다. random seed도 이제 설정할 수 있게 해놨다.


=============================

회고

딴짓을 많이 하는 것 같다. 그래도 앙상블 이런거 얘기 들어보면 정말 다양한 시도와 창의력이 필요한 것 같다. 할거랑 시도해볼게 많다는 뜻. 심지어 데이터를 만드는 것도 있으니..

2021년 3월 31일 수요일

AITech P-stage1 [Day 3] epoch는 적당히

 

================================

수업내용


어떤게 더 사용하기 편리하고, 어떤게 더 개조하기 좋겠는가?

tensorflow는 간단해서 사용하기 편리하게 만들었지만 공부하고 연구하는 거는 pytorch가 더 좋게 만듬. 철학이다.

모든 모듈들은 최종적으로 _ConvNd(Module)을 가진다. 내가 MyModel 안에서 정의한 nn.Conv2d들도, 내가 정의한 MyModel 자체도 모두..

그래서 모두 하나의 클래스로 정의되어 있기 때문에 위에 쌓고 위에 쌓고 분리되고 합쳐지고.. 하는 여러 자유로운 방식으로 구성되고 데이터를 주고받을 수 있는 것이다.




모두 같은 클래스를 가지게 된다는건 모두 같은 함수를 가지고 있다는 뜻. 즉 forward 하나만 실행하면 알아서 하위들의 모든 클래스에서 서로 각각의 forward들을 서로 실행하기 때문에 구성이 자유롭다는 것이다.

이건 pytorch 때문이기 보다는 python이기에 가질 수 있는 pythonic한 특징인데, 모든 모듈과 그에 해당하는 weight들을 dict 형식으로 저장하기 때문에 파라미터들을 그대로 불러올 때 그 불러와지는 모델의 구조를 알고 있으면 정확히 빼올 수 있다. 또 dict에서 key로 이름이 저장되어 있어서 원하는 weight들만 빼오는 방식도 할 수 있는 등 여러 개조가 가능함. 이래서 pythonic의 장점이라고 한다.
state_dict과 parameters의 차이점은 state_dict은 파라미터 이름 정보까지 같이 불러오는 거고 paramters는 그렇지 않음.


미리 학습된 모델을 load_dict 같은걸로 가져올 수 있는데 특정 layer는 학습시키고 안시키고를 requires_grad 를 설정하는게 가능하다. 왜 이름이 requires_grad냐면 딥러닝 이론 배울때 경사하강법을 이용해 학습하기 때문에 해당 layer가 출력값에 대한 미분값을 가지고 있어야 해서 grad를 가지고 있어야 학습이 가능. 그래서 grad가 필요없다고 하면 어차피 그 layer는 학습 안할거니까 grad가 필요없다는 뜻.

  




대체로 pretraining 된 모델을 쓰는게 좋다. 다만 내가 하고있는 project의 목적에 어느정도 맞는가 안맞는가를 고려하는게 중요.


만약 사무실에서 의자를 구분한다고 하자. 다양한 object 1000개를 분류하는 것과 유사하기 때문에 backbone은 그대로 냅두고 뒤에 있는 classifier만 학습시켜도 됨. cnn backbone의 역할은 해당 물체의 특징 feature를 뽑아내는 거라고 보면 된다.

반면 구름끼리 종류를 구분하는 거라면? 아니면 자동차끼리 종류를 구분하는 거라면? cnn backbone은 대체로 저렇게 생겼으면 구름이고 바퀴랑 몸통만 있으면 자동차다 이런식으로 특징을 뽑아내도록 이미 학습되어 있기 때문에 backbone을 그대로 둔다면 잘 안될 가능성이 큼. 그럴땐 cnn backbone까지 학습시킨다.

사실 모델 목적이랑 진짜 전혀 상관이 없다해도 모든 weight를 초기화해서 바닥부터 시작해서 하는것보다는 그래도 pre-trained model에서 backbone을 바꿔가면서 하는게 성능이 잘 나온다는 여러 사람의 경험과 주장이 있다. 그래서 왠만하면 쓰는게 좋은듯.



하지만 위 모든 것들은 데이터 수가 충분히 많들때를 가정해서 말한거다. 데이터가 별로 많지 않으면 overfitting, underfitting이 될 가능성이 매우 크기 때문에 걍 하지 말자..


===========================

피어세션

adamP

그냥 구글에 쳐서 pip로 깔면 됨


gpu, delete cash로 내리는게 있다


저작권 때매 포트폴리오 못만든다고 하면 다른 공개된 외부 데이터로 해서 만들자.


=======================================

목표

어제 못한 data payload 잘 만들어서 모델에 돌리기


=================================

행동

pretrained model들은 cnn 바로 뒤에 그냥 linear로 연결해서 잘 작동해서 그대로 따라했는데 왜 자꾸 안되는지 의문이었다. 그냥 사이에 flatten 넣어줘서 해결했다.

그래서 모델로 돌려봐서 결과가 나왔는데 epoch 4, 9, 12, 16으로 돌린 결과 중 9가 가장 잘 나왔다. 이 모델은 vgg19에서 cnn의 끝자락부터만 바뀌도록 fine tuning을 해서 나온거다. 이제 할수 있는건 misson에서 나온 모델도 돌려보고 data argment도 예시 코드에서 줬으니까 이용해서 더 돌려보고 앙상블도 해보고 할 수 있겠다.

mission에 있는 형식대로 모델을 잘 짰는데 돌리면 성능이 너무 바닥이고 val의 acc이 자꾸 0이 나온다. 어제도 그랬었는데 코딩에서 생긴 버그 같다. 한번 찾아봐야겠다.

==================================================

회고

버그 찾기. linear 앞에 flatten을 꼭 붙이자. pretrained model도 사실 사이에 있지만 숨겨진거 아닐까.

2021년 3월 30일 화요일

AITech P-stage1 [Day 2] 아직도 data payload에서 막힘.

 

=============================

수업내용





data argumentation도 좋지만 그에따른 병목현상도 고려해야 한다.



dataset은 몇 번째 index에 해당하는 자료가 뭔지를 뽑아내는 거고, dataloader는 그걸 더 편리하게 해주는 것에 불과함. 둘을 잘 분리해야 한다.


num_workers를 무조건 늘린다고 좋은게 아니다. cpu로만 학습할 때는 과부화 뭐 그런 문제가 있는 듯. 그래서 데이터나 프로젝트, cpu코어 갯수 등.. 환경마다 고려해서 확인해주는게 좋음.



=================================

피어세션

Additionally, VGG networks are trained on images with each channel normalized by mean=[0.485, 0.456, 0.406] and std=[0.229, 0.224, 0.225]. We will use them to normalize the image before sending it into the network.

그냥 일반적으로 저렇더라. 보편적으로.


class 불균형할때 쓰는 loss


fmse loss

focal loss 좋다? invalance 해결하려고 나온거니까

entropy loss


adam

adamP


자소서 쓴거 물어보는듯.


카카오는 모든 코딩문제를 풀 정도로 문제해결력이 뛰어나거나, 코테 통과할정도로만 하고 딥러닝 지식에 대해 매우 잘 아느냐.

설명을 위해 맞춰야겠다. 주석 무조건 달아야겠다.

네이버. 인성면접. 자기소개 하나만 하고 진짜 CS, 운영체제, 알고리즘 문제, 구글에서 나왔던 면접질문(사고력을 요하는, 골프공 구멍 몇개)


어떻게 왜 썼다 당당하게 말할 수 있게. 일단 써보고 생각하는게 나을듯. 다양한 시도=


=====================================

목표

어제 했던걸 기반으로 data argumentation 이런거 생각하지말고 간단하게 통과시켜 결과를 보고 조금씩 추가하고 수정하는 방식으로 하자.


============================

행동

기존 vgg19 모델에서 내가 원하는 뒷부분만 학습시키게 다 만들었는데 모델에 입력 이미지가 안들어간다. 지금 성질나서 글 못쓰겠다.

내가 어떤 변수에 어떤 경로변수를 저장했는지 잘 인지해야 겠다.

지금 막힌건 뭐 linear에 안맞대. 그냥 지나ㅉ 아니 이미지 사이즈까지 맞추 ㅓ줘도 안된다고 징징대면 뭐 어쩌라고


====================

회고

왜 안되는거야