티스토리 뷰

딥러닝 기술적 측면 중심의 글을 발행하게 되면서, '왜 작성하게 되었나'에 대한 서론이 깁니다. Accuracy 높이는 방법만 궁금하신 분은 스크롤을 내려 해당 부분만 참고하시고, 서론을 읽고 싶은 분은 얼마든지 환영입니다.


서론

내가 인공지능 교육을 통해 머신러닝과 딥러닝을 공부하는 동안 비즈니스 실무 분야를 선택할 것인가, 딥러닝 연구 분야를 선택할 것인가에 관한 고민이 있었다. 공부를 하다 보니 엔지니어 영역은 기존에 컴퓨터공학을 제대로 전공했던지, 아니면 프로그래밍 능력이 출중하다던지 둘 중 하나가 우선 갖춰져야 하는 것이라는 걸 깨닫게 되었다. 그래서 나는 엔지니어 영역보다는 비즈니스 영역에 중점을 두고 직업인으로서의 진로를 집중하게 됐다.

 

그러다 보니 비즈니스 실무 영역에 더욱 도움이 될 만한 추가 공부를 하게 되었고, 인공지능 교육을 통해 배운 것 중 Time-Series Data와 Demand Forecasting이 중요하다고 생각했다. K-Digital Training 일환으로 시행되는 모두의연구소의 교육은 딥러닝의 비중이 크다. 그래서 수행한 학습 프로젝트들은 대부분 딥러닝이었고, 매주 딥러닝 프로젝트를 수행해서 GitHub에 발행했지만 백업하여 블로그에 정리하는 것은 필요치 않다고 생각했었다. 또한, 코드를 전부 직접 짜서 1주일에 1~2개의 프로젝트를 수행하기란 천재가 아닌 이상 불가능한 것이었고, 저작권 문제로 인해서 수행한 프로젝트의 코드를 온라인 상에 공개하는 것이 금지되었다. 따라서, 블로그에 글을 작성하기 애매한 점도 있었다.

 

가고 싶은 회사가 없어서 창업, 취업, 대학원 3가지의 선택지를 두고 고민의 나날을 보내면서, 지원 제의를 받거나 채용공고를 서핑하면서 채용 분야의 특성이 명확해져 갔다.

 

이렇게 복합적인 고찰을 거쳐 소프트스킬의 비중을 조금 낮추고 '고급 기술 능력'에 조금 더 집중해야겠다는 결정을 하게 되었다. 내가 당장 딥러닝으로 업무를 보기는 현실적으로 어렵겠지만, 딥러닝 탐구 글을 발행함으로 인해 논리적이며 분석적인 사고를 통해 발전하는 사람이라는 점을 어필할 수 있을 것이다.


본론 : 가위바위보 Accuracy를 높이는 방법 탐구

가위, 바위, 보 사진을 수집해서 이게 가위인지 바위인지 보인지 판별하는 프로젝트를 통해 accuracy(정확도)에 관한 탐구를 했다. 추후 개별 공부를 통해 accuracy가 마냥 높은 것(Overfitting)이 현실에서는 좋지 않을 수 있다는 점을 알게 되었다. 훈련 데이터(Train set)에 정확도를 높게 설정하면 현실에서 생기는 문제점은 새로운 데이터가 들어왔을 때 판별력이 떨어질 수 있다는 것이다. 새로운 데이터를 판별할 때 판별력을 높이기 위해서 데이터 훈련 단계에서 정확도를 고의적으로 낮추는 방법을 사용할 수 있다. 해당 프로젝트 과제를 수행할 때는 Train set의 정확도를 의도적으로 낮추는 것이 Test set 판별 정확도에 영향을 미친다는 정보를 몰랐었기 때문에 해당 방법은 시도해 보지 못했고, 나름 가설 설정과 결과를 도출하여 과제 수행 요건을 충족시킬 수 있었다.

 

우선, 데이터를 모은다. 가위 사진 100장, 바위 사진 100장, 보 사진 100장 이런 식으로 몇 백장의 사진 데이터를 만든다. 데이터가 많을수록 학습 능력이 좋아진다. 가령, 우리가 반복 학습을 통해 1 더하기 1은 2라는 것을 생각을 거치지 않아도 바로 답을 뱉어낼 수 있게 되는 것처럼 학습을 반복할 수 있는 데이터가 많으면 좋다. 그런데, 방대한 데이터를 직접 수집하는 것은 비용과 시간이 많이 드는 일이므로 그렇게 할 수는 없고, 원리를 이해하는 공부 측면에서 데이터 수집부터 직접 해 본다.

 

모델 학습을 시키기 전에 이미지를 resize 해준다. 그리고 출력해 보면 아래와 같은 결과를 확인할 수 있다.

가위

 

이렇게 수집한 데이터로 학습을 돌려본다. 반복 학습 횟수인 Epoch를 조정하면서 결과를 비교해 볼 수 있다. 기본적으로 10번 학습을 시켜본 후 나온 결과를 분석해 보고 적당한 Epoch를 설정한다.

7번째 까지 accuracy가 확연히 높아지고, 9번째에서 가장 높게 나온 후, 10번 째에서 낮아진다. 9~10번 정도 훈련이 적당해 보인다.

 

이 프로젝트의 과제인 테스트 데이터(Test set)의 accuracy를 높이기 위해서 여러 방법을 시도해 보았다. 결과적으로, Train-set을 600개, Test-set을 300개로 설정하고, 훈련 데이터의 구성(이미지 종류)을 변경하였다. 반복 학습(Epochs)은 10번으로 하였고, 최종적으로 Test set의 Accuracy를 61%로 향상시킬 수 있었다.

 

오버피팅을 극복하기 위해서 다음과 같은 시도를 했고, 정규화, 피쳐 수 조정, 반복학습 횟수 조정을 통틀어 가장 높은 test_accuracy값은 54%였다. 따라서, 데이터셋을 조정해야 한다는 결론이 나왔다.

 

1. 정규화 시도

  • kernel_regularizer=keras.regularizers.l2(0.001)
  • L2 정규화 시도 시 accuracy=44% --> 46%

2. 피쳐의 수 줄이기

  • n_channel_1, n_channel_2, n_dense를 조정하여 피쳐의 수를 감소시켜 보았음
  • 1) 32, 64, 32 설정 시 parameter 70,723, accuracy=34%
  • 2) 16, 32, 32 설정 시 parameter 30,819, accuracy=54%

3. epochs 조정해 보기

  • epochs=5, accuracy=39%
  • epochs=10, accuracy=37%
  • epochs=15, accuracy=38%
  • epochs=18, accuracy=45%
  • epochs=19, accuracy=51%
  • epochs=20, accuracy=48%
  • epochs=30, accuracy=43%
  • epochs=40, accuracy=47%
  • epochs=50, accuracy=34%

Data-Set 조정

  • 손의 날선모양 같은, 구분이 모호한 이미지 8개를 삭제하고 가위 앞면 4개와 뒷면 4개로 대체하여 테스트함, accuracy=44%
  • 훈련 데이터 100개씩 추가하여 총 600개로 테스트함, accuracy=47% epochs=9
  • 위 세팅에 정규화 적용 시 accuracy=50%까지 올라감
  • 특정 각도의 손 모양 여러 사람 데이터를 대량 추가하여 1866개의 데이터로 테스트함, accuracy=52%, epochs=15
  • 위 세팅에 정규화 시도 시 accuracy=56%까지 올라감
  • 공통적으로 n_channel_1, n_channel_2, n_dense는 16, 32, 32일 때 가장 accuracy가 높게 나옴.
  • feature 값(n_channel_1, n_channel_2, n_dense)이 커질수록 정규화 시 accuracy가 내려감.
  • 데이터의 양을 증가시킬 시 accuracy 5~6% 증가. But, accuracy가 60%를 넘지 못함.
  • 정규화 시 3~4% 정도 accuracy가 증가함. But, accuracy가 60%를 넘지 못함.
  • 결국, 데이터의 양보다 데이터의 구성이 중요하다는 가설을 도출할 수 있음.

결론

위와 같이 여러 시도를 해 보았을 때, 데이터의 양보다는 구성을 변경해야 한다는 판단이 섰고, Test-set accuracy를 과제 통과 기준인 60% 이상으로 만들 수 있었다.

 

최종 결과 도출 세팅 값

  • 데이터의 개수는 훈련 600개, 테스트 300개로 하였음.
  • 훈련 데이터의 대표 이미지(ex. 손바닥, 손등) 비중을 증가시키는 방법으로 데이터 구성을 달리하여 최종 테스트.
  • feature값 n_channel_1, n_channel_2, n_channel_3, n_dense는 128, 256, 256, 256으로 설정 (레이어 하나 더 추가함)
  • epochs=10
  • test_accuracy=61%
  • 최종 결과 test_accuracy 60% 이상 도달!
댓글
최근에 올라온 글
페이지 이동 안내

보던 글 목록 : 브라우저 뒤로 가기 메인 화면 : 좌측 상단 아이콘
🍍 The GOAL: AI expert에 가까워지는 중

🍍 I am becoming AI expert who can develop cool things by coding.