yoooniverse
[coursera] CNN in TensorFlow Week1_assignment 후기 본문
정말 개뻘짓하다가 과제를 풀어내서 아는 개념은 없지만 뭐라도 적어놔야 울분이 풀릴 것 같아 쓰는 글.
텐서플로우 자격증 준비를 위해 듣는 coursera 강좌 중 두번째 강좌의 week1 과제에 대한 글이다.
강좌명 : Convolutional Neural Networks in TensorFlow
세부 목차 : Week1 프로그래밍 과제
과제 내용 :
캐글에서 제공하는 유명한 데이터셋인 'cats-and-dogs'을 이용해 강아지와 고양이 이미지 분류 모델을 만들어 일정 수준의 정확도를 도출해내는 과제이다.
CNN 구조의 모델을 구현하고, keras API를 이용해 데이터 전처리를 해내는 것이 과제의 주된 태스크이다.
(1) 첫번째 눈물의 똥꼬쇼 : DATA SPLIT
'cats-and-dogs' 데이터셋을 처음 다운받으면, 그냥 'Cat'과 'Dog' 폴더 아래에 고양이와 강아지의 이미지들이 저장되어 있다.
이 폴더들 안의 이미지들을 아래 폴더 구조에 맞게 분류 및 복사하여 넣으면 된다
가장 먼저 짜야 하는 함수는 이 데이터셋 폴더(위 이미지)의 이미지들을 train_set test_set으로 분류 후 별도의 폴더(아래 이미지)에 이 이미지들을 나누어 복사해 넣는 것이다.
그래도 coursera에서 친절하게 함수 구현에 매우 도움이 되는 메소드들의 목록을 제공해준다.
즉, 제공해준 메소드들을 잘 짜 넣기만 하면 어렵지 않게 DATA SPLIT 함수를 짤 수 있다는 것이다.
단!!!! 과제를 푸는 본인이 그 메소드들을 잘 알고 있어야 한다. 얼레벌레 아 대충 이런 기능이었지~~라는 생각만 가지고는 절대 쉽게 코드를 짤 수 없었다. (어떻게 알았냐면 저도 알고 싶지 않았읍니다)
예를 들면, os.path.getsize() 함수의 경우 매개변수로는 반드시 파일 경로를 넣어주어야 한다는 거..
개발 전공자들이 보게 되면 뭐야 기본도 안되어있구먼 하고 무시할지 모르겠지만,,
문과에 개발 비전공자로서 뭘 배우든 기초를 정말 탄탄히 하지 않으면 남들은 식은 죽 먹기로 해치우고 넘어가는 데서부터 막혀서 끙끙댈 수 있다는 걸 뼈저리게 느꼈다. 프로젝트든 뭐든 중요하지만 알고리즘이나 기본 언어 문법들은 머릿속에 지워지지 않게 계속해서 익혀두어야 하는 것 같다.
(2) 두번째 눈물의 똥꼬쇼 : 훈련 모델 만들기
강의에서 배운 keras의 sequential model을 응용하여 나만의 훈련 모델을 만드는 부분이다.
물론 이 부분 역시도 coursera에서 친절하게 맞춰야 하는 사항들과 이를 위한 조언들을 남겨둔다.
그 내용은 간단하게만 옮겨보자면,
- 손실 함수는 이전 예제에서 살펴본 것처럼 class_mode와 적합한 것으로 골라야 하며, 에러가 발생하지 않음을 통해 그 손실 함수와 분류 유형의 조합이 괜찮은 것임을 확인할 수 있다는 것이다.
- 또, 원하는 결과를 만들어내기 위해서는 최소 3개 이상의 convolution layer를 만들어야 한다는 것도 알려줬다.
이전 예제에서는 이번 과제와 동일한 데이터셋을 가지고 진행했으며, 이진 분류 모델을 만들어 분류하는 내용으로 진행했었다.
즉 내 판단으로는 해당 과제 역시 이전 예제의 내용과 크게 다를 것이 없었다는 것이었다.
그래서 데이터의 크기만 커졌지 모델 학습 방식은 동일할 것이라는 판단 하에 거의 유사한 모델을 이용해 모델을 짰고,
그 결과 난 아무리 모델을 돌려도 원하는 훈련 결과를 만들어내지 못했다.
과제를 충족하기 위해 맞춰야 하는 정확도 : training accuracy of at least 95% and a validation accuracy of at least 80%
내가 만든 모델로 나오는 정확도 : 훈련 데이터셋 정확도와 검증 데이터셋 정확도 각각 80% 후반, 초반 언저리...
모델에 레이어를 추가해도(convolution layer, dense layer 뭘 추가해도 변동이 없었고),
그럼 뉴런 갯수를 다르게 해보자 해서 수정해봐도(파라미터 개수를 크게 늘려도 변동이 없었다 아오)
도대체가 두 데이터셋 정확도가 팍 올라가질 않았다.
그 와중에 구글 코랩 GPU는 끊겨서 또 개열받았음.
구글 코랩에서의 GPU 사용은 시간 제한이 있기 떄문에 사용이 끊기면 그냥 구글 부계정 여러개 만들어서 GPU 돌리세요.
구글 코랩 유료도 별 메리트 없음 그냥 부계 만들어서 돌리는 게 짱입니다.
한번 시간 제한 걸렸는데 20시간 지나도록 안풀리고 있어요 ㅡㅡ
분명히! 이진 분류에 loss 함수는 RMSPROP으로 진행하는게 젤 적합하다고 알고 있었고 이전 예제에서도 해당 함수 가지고 잘만 돌렸는데!! 안나왔다. 이거때문에 새벽 네시까지 고민하고 뉴런 개수랑 레이어 구조 바꾸면서 개뻘짓을 새벽 네시까지 했었지.
근데 coursera 커뮤니티에서 나같은 사람이 동일한 이슈로 질문 글을 올렸었고, 답글로 loss 함수를 바꿔봐라,, 라는 내용이 있길래
마지막 지푸라기 잡는 심정으로 'adam'으로 바꿔서 모델을 다시 돌렸다..
결과는.. 훈련 데이터셋 정확도 증폭과 검증 데이터셋의 애매한 정확도 모두 충족이 됐더라는(오버피팅을 만들어냈다는) 허무한 결말.
결론은 모델 구조를 짜기 위해서는 모델의 파라미터들에 대한 보다 정확한 이해와 여러 파라미터들의 차이를 명확하게 알고 있어야 한다는 것이었고.
그 결론의 결론은 수학과 통계 공부 없이는 이 요구 조건을 충족할 수 없다는 얘기다.
수학이랑 통계를 모르면 기본적인 구조 이해가 안되기 때문에 필수 요건이다..
하 만만하게 봤다가는 큰코 쌔려맞고 쭈그렁방탱이 되는 수가 있다는 걸 24시간 동안의 개뻘짓을 통해 배웠다.