데이터 구하고 가공하기에서 한 작업은 정치인들의 사진을 인터넷에서 크롤링 한 후 정확도 향상을 위해 사진에서 얼굴 부분만 추려낸 후 이 것을 Tensorflow서 사용 할 수 있는 파일 형식인 tfrecord로 변환하는 작업이었다. 이제는 변환된 데이터를 이용해서 학습을 시키는 일만 남았다. 이번 포스팅에서는 데이터를 학습시키는 과정들을 쭉 살펴보려고 한다.


1. Tensorflow 설치하기 (feat, 그래픽 카드 없이는 못쓴다)


Tensorflow는 내 데스크탑에 그래픽 카드가 있느냐 아니면 없느냐에 따라서 설치 명령어가 달라진다.


(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU


이 프로젝트를 처음 시작 했을 때 내 리눅스 PC는 그래픽 카드가 없었다. 애초에 이 PC는 오직 교육용으로만 사용하기 위해 게임을 할 수 있는 환경 자체를 차단 하려고 했었다. 그래서 맨 처음에 tensorflow를 설치 했을 때는 가장 위에 있는 CPU만 사용 하는 tensorflow 버전으로 설치했었다. CPU만 사용하니 한 번 학습 시키는데(뉴럴 네트워크에서 1회 학습을 하는 경우) 10초 정도 소요됐다. 10000회 정도 학습 시키려면 컴퓨터를 켜 두고 출근해야 하기도 했다.


그런데 회사 선배가 자기가 쓰던 그래픽 카드를 싸게 판다는 말을 듣고 컴퓨터에 설치해서 학습 시켜보니 퍼포먼스가 무려 20배 이상 차이가 났다. CPU만 사용했을 때 10초 정도 소요되던 것이 그래픽 카드를 사용하니까 0.5초면 가능했다. 10000회 학습 시키려고 컴퓨터를 켜두고 출근을 했었는데 이제는 1-2시간 정도면 끝났다. 그동안 내가 얼마나 많은 시간을 학습 과정에서 소비하고 있었던 것일까. 시간이 넉넉한 사람이면 모르겠지만 그래픽 카드의 유무에 따라서 작업의 퍼포먼스 차이가 크다. 초기부터 그래픽 카드를 사용했다면 불필요하게 시간을 허비하지 않았을텐데.


그래픽 카드를 사용했을 때 학습 속도, 1회 학습하는데 0.5초가 소요되고 있다

2. 학습 모델 선택하기


Tensorflow github에선 이미지를 분류 할 수 있는 다양한 학습 모델을 파이썬 코드로 짜뒀다. 개발자는 학습시키는 명령어에 사용할 학습 모델을 옵션으로 추가하면 간단히 학습 시킬 수 있다. 현재 tensorflow에서 만들어둔 학습 모델로는 이런 것들이 있다.


위 사진에 있는 학습 모델들은 이미 논문에 등재된 뉴럴 네트워크를 구글이 tensorflow에서 사용 할 수 있는 형태로 변환 한 것이다. 학습 모델의 이름을 인터넷에 검색해보면 논문 자료를 다운 받을 수 있으니 관심이 있으면 읽어보는 것도 좋다. 물론 내용이 결코 쉽진 않다. 나는 간단히만 읽어봤다.


이미지 인식 모델 중 가장 유명한 모델은 inception 시리즈이다. 이 모델은 현재 네번째 버전까지(inception_v4) 나왔고 imagenet 컨테스트에서 가장 우수한 학습 알고리즘으로 선정됐다. 하지만 서비스를 하려면 정확도 뿐만 아니라 학습하는데 소요되는 시간 및 유지 관리의 측면도 중요할 것 같아서(당시엔 그래픽 카드가 없었기 때문이기도 하다) 이 모든 요소를 절충 할 수 있는 학습 모델을 찾기로 했다. 이때 검증용으로 사용한 데이터는 tensorflow에서 제공하는 flower 데이터를 사용했다. inception_v1을 사용 했을 때는 학습 속도 자체는 나쁘지 않았으나 퍼포먼스가 좋지 않았고 inception_v3, inception_v4는 학습 속도가 너무 느렸다. 결과적으로 inception_v2가 학습시간 대비 가장 훌륭한 퍼포먼스를 보였다. 이미지 학습 모델은 inception_v2로 선정했다.


3. 학습 결과


정치인들 한 명당 대략 100장 정도 사진이 있었고 총 정치인의 수는 99명 이었다. 이 데이터로 inception_v2 모델로 10000회 정도 학습을 시켰는데 정확도가 70%정도 나왔다. 이 정도면 데모용으로 사용하기엔 적합한 수치였다. 기존 논문 대비 적은 양의 데이터임에도 불구하고 퍼포먼스가 좋은 이유는 아마 크롤링한 데이터에서 따로 얼굴 부분만 추려내고 동명 이인인 데이터를 필터링 하면서 순도 높은 데이터를 골라 냈기 때문인 것 같다. 많은 양의 데이터도 중요하지만 순도 높은 데이터도 중요하다는 사실을 확인해 볼 수 있었던 것 같다.