1.전이학습(transfer learning)을 이용한 안저영상 기반 classification
- 안저영상 데이터셋을 다운로드하는 사이트: https://www.kaggle.com/c/diabetic-retinopathy-detection
- 데이터셋의 크기가 82GB이라서 매우 큼.
- 학습할 때는 데이터셋의 일부만 사용하면 됨.
- 전이학습을 이용하여 데이터셋의 일부만 사용하더라도 성능이 나올 수 있도록
이런 과제를 부여받았다.
먼저 데이터셋을 다운받을려고 하니깐 82GB다. 내 노트북엔 30GB의 여유밖에 없었고, colab도 들어갈 수가 없으니 다른 어찌할까 하다가 어떤 분의 코드를 보고 이미 재업로드된 7GB의 영상 데이터셋이 있는 것을 확인했다.
또한 이 분의 코드를 공부한다는 관점으로 하나씩 실행해보았다.
https://www.kaggle.com/fanbyprinciple/pytorch-diabetic-retinopathy
우선 나는 colab에서 실행하는 것이니 이분의 local과 다르므로 colab에다 데이터셋을 다운 받아야 했다.
위의 코드를 실행하여 API를 넣고, 다운받을 colab주소를 지정해주면 다운받을 준비 끝.
다음으로 kaggle에서 다운받길 원하는 데이터셋의 api 주소를 복사해서 넣어준다음 압축을 풀어주었다.
다운받은 데이터셋이 잘 있는지를 확인하기 위해 이름, 경로 등을 확인한다.(나중에 함수에다가 다 넣을 거라)
또한 터미널을 이용해서 resize와 tensor로 바꿔주는 함수를 묶어준다. 이러면 나중에 데이터를 변환할 때 편하기 때문에 많이 쓰는 기법.
이제 데이터셋 함수를 만들어보자.
df안에 cropped를 넣는다. 이 cropped란 csv파일을 가져온 데이터프레임은 이미지 이름과 label이 있음.(label은 정답지
-모델이 학습하는데 정답지가 있어야지 뭘 고치는지 알 수 있으니깐)
다음으로 이미지를 경로와 df의 이미지 이름을 통해 가져온 다음, 아까 만든 터미널을 이용해 데이터 사이즈를 재조정하고 tensor형태로 변환해준다.
이렇게 함수를 만들었고,
함수를 불러왔음.(데이터 전체를 불러왔었는데, 학습이 너무 오래 걸려서 10000장만 load했다.)
잘 불러왔는지 확인해보는 코드
이제 하이퍼 파라미터를 설정해주자.
우선 이 데이터셋의 레이블은 0,1,2,3,4로 총 5개. (0이 정상 갈수록 병이 심해지는 정도)
학습률을 0.0001로 설정
epoch(데이터셋 전체를 반복하는 횟수)를 1로 두었다.
마지막으로 GPU를 쓰게 설정한다.(없으면 CPU를 쓰게)
이제 기존 학습된 model을 불러오자. torchvision에선 다양한 모델이 이미 구현되어 있다. VGG, GoogleNet 등 다양하다.
아까 맨 앞에 이 코드를 썼던 분께선 inception_v3를 쓰셨다.
param의 grad를 false로 둔건 특징추출 층에서 가중치의 변경을 하지 않겠다. 즉 학습된 가중치는 그대로 두겠다란 뜻이다.
마지막으로 inception은 imagenet으로 학습했기 때문에 분류층이 1000개인데 이것을 우리에게 필요한 5개의 분류 아웃풋으로 바꿔준다.
모델을 출력해보면, inception_v3의 layer 층을 보여준다.
이제 모델의 뼈대를 구축했고, optimizer와 loss함수를 지정해주자.
optimizer는 가중치를 변화율과 학습율에 따라 바꿔주고, loss는 얼마나 변화해줄지를 판단하는 지표라 보면 된다.
optimizer 중에서도 다양한 것들을 쓰는데 그 중 Adam을 사용했고(제일 대중적으로 사용함)
loss는 크로스엔트로피 loss를 사용했다.
이제 데이터셋을 batch_size 기준으로 셔플하여 로드한다.
다음으로 모델을 학습시킨다.(아직 공부하는 단계라... 정확히는 모르지만 마지막 FC층만 학습되는 것 아닌가 하는생각이 든다.- 구글링 해봐야겠네)
또한 학습이 오래걸려서 여러번 하이퍼 파라미터를 조정했다. - 더 적게 학습할수록 정확도는 낮아지겠지만 나한텐 시간이 없어.ㅎ
마지막으로 test 데이터셋을 평가하는 모델을 만들어서 정확도를 확인하는 함수를 만든다.
이렇게 코드를 리뷰해봤다. (뭐랄까.. 이제 흐름이 약간 보이는 것 같다.)
'ML > ML-Kaggle, 데이콘' 카테고리의 다른 글
랜덤포레스트(RandomForestRegressor) (3) | 2021.09.29 |
---|---|
결측값 전처리 (0) | 2021.09.29 |
의사결정나무 (0) | 2021.09.28 |
kaggle에서 colab으로 데이터 가져오기 (0) | 2021.08.11 |
ML 기초 실습 과제 (Data : Predicting Food Delivery Time) (0) | 2021.06.06 |
댓글