================================
수업내용
어떤게 더 사용하기 편리하고, 어떤게 더 개조하기 좋겠는가?
tensorflow는 간단해서 사용하기 편리하게 만들었지만 공부하고 연구하는 거는 pytorch가 더 좋게 만듬. 철학이다.
모든 모듈들은 최종적으로 _ConvNd(Module)을 가진다. 내가 MyModel 안에서 정의한 nn.Conv2d들도, 내가 정의한 MyModel 자체도 모두..
그래서 모두 하나의 클래스로 정의되어 있기 때문에 위에 쌓고 위에 쌓고 분리되고 합쳐지고.. 하는 여러 자유로운 방식으로 구성되고 데이터를 주고받을 수 있는 것이다.
모두 같은 클래스를 가지게 된다는건 모두 같은 함수를 가지고 있다는 뜻. 즉 forward 하나만 실행하면 알아서 하위들의 모든 클래스에서 서로 각각의 forward들을 서로 실행하기 때문에 구성이 자유롭다는 것이다.
미리 학습된 모델을 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도 사실 사이에 있지만 숨겨진거 아닐까.
댓글 없음:
댓글 쓰기