내일배움캠프 AI - 24일차 TIL, 2022.05.20

Dongwoo Kim·2022년 5월 21일
0

TIL / WIL

목록 보기
26/112

스파르타 코딩클럽

내일배움캠프 AI 웹개발자양성과정 2회차

2022.05.20. 24일차- TIL

1. CNN 모델 학습

09:00-12:00

오늘은 팀 프로젝트에서 사용할 CNN 모델을 학습시켰다.
먼저 kaggle에서 우리가 원하는 marvel heros 데이터셋을 찾았다. 생각보다 다양한 데이터셋이 있지는 않았지만 총 8종류의 마블 캐릭터가 3000여장으로 이루어진 데이터셋을 이용하기로했다. 4명의 팀원이 각자 다른 CNN 모델을 정하여 학습시키기로하고 InceptionV3, MobileNetV2, VGG16, ResNet50으로 정했다. 그중에서 나는 InceptionV3 모델을 학습시키기로했고 kaggle에서 해당 데이터셋으로 0.6 정도의 accuracy를 낸 것을 목표로 삼고 정확도를 높히기위한 미세조정을 진행했다.

미세조정 가이드는 kaggle 공식문서를 참고하여 최초에 pre-trained된 모델을 Adam으로 학습시킨뒤 일정 epoch이상이 되면 과적합을 피하기위해 SGD로 학습영향을 최대한 적게 받도록해서 학습을 시켰고 최종적으로 0.6430의 validation accuracy을 얻을 수 있었다.

epoch이 10이상이 넘어가면 과적합이 된다.
SGD로 미세조정하여 학습시킨 모습

2. CNN 모델 파악

12:00-13:00 점심시간
13:00-14:00 CNN 모델 리뷰
14:00-17:00 모델 학습
17:00-18:00 학습결과 공유

오후에는 팀원들과 같이 각자 맡은 CNN 모델의 구조에 대하여 공부해보는 시간을 가졌다. 사실 오전에 모델을 학습시키기 전에 미리했으면 좋았을 텐데 그러지못해서 아쉬웠다. 일단 CNN에서 convolution layer의 input/filter/output의 size, depth의 관계에 대해 이해보고 각각의 모델의 대해서 어떻게 구조가 개선되었는지 찾아보았다. 인상깊었던 점은 mobilenet에서 depthwise convolution과 pointwise convolution으로 weight parameter 개수를 획기적으로 줄인 부분이었다. parameter 개수를 줄이기위해 filter의 크기를 줄이는 대신 depth를 증가시키는 방법(ex. x5 filter를 3x3 filter 2개로)은 알고있었지만 mobilenet과 같은 방법은 처음봐서 신선한 느낌을 받았다. 하지만 이러한 구조를 팀원들에게 설명하고 이해시키는데는 시간이 오래걸리기도 했다.

출처 : https://minimin2.tistory.com/42

이후에는 각자의 모델의 장단점과 학습결과를 프로젝트 문서에 작성했고 결과를 비교해보았는데 VGG16 모델을 제외한 다른 모델들은 대부분 0.6~0.65의 validation accuracy로 비슷한 결과를 얻었다. VGG16은 모델이 너무 무거워 학습시간이 오래걸려서 그런지 정확도가 좋은 결과를 얻지 못했다. 따라서 우리는 비슷한 성능이라는 전제하에 비교적 빠르고 가벼운 mobilenet을 프로젝트를 진행하는데 사용하기로 정했다.

팀원별 모델의 특징과 학습결과를 프로젝트 문서에 기록한 모습

3. 타임어택 - 파일 저장은 어떻게.?

18:00-19:00 저녁시간
19:00-20:00 타임어택
20:00-21:00 일일회고 및 TIL 작성

저녁에는 오늘이 금요일이기 때문에 타임어택이 진행되었다. 주제는 강아지고양이분류기 만들기. 코드 작성 자체는 머신런닝 강의 실습과 숙제과 비슷한 난이도였기 때문에 어렵지 않았다. 다만 문제는 추가 단계로 웹서비스로 이미지를 받아서 학습시킨 모델로 결과를 예측해보는 기능을 만드는 것이였다. 우선 파일을 클라이언트로부터 받아서 서버로 전송하는데 있어서 기존의 다른 request parameter들을 전송하는 방법으로 보내면 이미지파일을 bytes 형식로 넘어져서 서버쪽에서 이미지파일을 저장하는데 있어서 번거로움이 있었다. 결국 제한시간 안에 이부분을 완벽하게 구현하지 못했었는데 나중에 튜터님의 해설을 들어보니 서버쪽에서 request.files[] 형식으로 받으면 file object를 받을 수 있었다. 이부분은 이전 프로젝트에서도 궁금했던 부분으로 나의 파트가 아니라 제대로 알지 못하고 넘어가서 아쉬웠었는데 이번 기회에 확실하게 알 수 있어서 좋았다.

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file_give']
    title = request.form['title_give']
    extension = file.filename.split('.')[-1]
    today = datetime.now()
    mytime = today.strftime('%Y-%m-%d-%H-%M-%S')
    filename = f'{mytime}'
    save_to = f'static/img/catdog/{title}_{filename}.{extension}'
    file.save(save_to)
    return jsonify({'result':'success'})

4. 개발 문서 & 코드

profile
kimphysicsman

0개의 댓글