데이터분석/Deep Learning

텐서플로우 입문기 (4) - 딥러닝(CNN)을 통한 손글씨 인식.

늘근이 2016. 12. 24. 23:16

컨볼루션 뉴럴 네트워크. 이름만해도 너무나도 멋있는 기법인데 사실은 이걸 이해하려고 위키피디아를 보고있으면 20시간을 봐도 이해하지 못 한 기억이 있다. 너무나도 처음부터 전문적인 내용을 파려고 했던듯. 

근데, 이 작은 책은 이해하는데 20분도 채 걸리지 않게 해주었다.


일단, 그 무시무시한 컨볼루션 신경망을 한번 이미지검색해본다.



이렇게 보면 이해할수가 없다. 무언가 단계만 많이 보이는듯. 


아무래도 컨볼루션(합성곱) 의 경우는 이미지 인식에서 굉장히 많은 기여를 하였고, 태생자체도 시각적 특징을 감지하는데 많이 쓰인다고 한다. 

생각을 해보면 어떠한 이미지를 인식하는데 픽셀 하나하나 검사하면, 사실은 너무 지엽적일수 있다. 사실 우리는 좀더 큰 시야에서 특징을 잡고 사물을 인식하지 않나? 예를들어 눈이 보이면 대충 사람인걸 알수있듯이 눈의 하나하나의 픽셀을 인식하는게 아니라 대국적으로 큰그림을 봐야한다는것이다. 

예를들어 숫자가 써있는 글자, 즉 입문기(3)에서 보았던 글자를 인식해야 한다고 친다. 인공신경망에서는 각각의 픽셀 하나하나를 하나의 노드로 보고 판단하여 확률이 제일 높은 숫자를 골라내었다. CNN은 그렇게 지엽적으로 접근하는게 아니라 일정한 크기의 윈도우를 가진 (예를들어 5*5 윈도우) 격자를 계속 들이대어 한 부분에 있어 특징을 골라내도록 한다. 신기하게도 가중치 행렭롸 편향을 공유하게 된다. 이 공유행렬을 커널이나 필터라고 하며 이는 이미지의 부분에서 그 자체의 고유한 특징을 찾기위한 도구가 된다. 


이렇게 이해하면 좋을지는 모르겠지만, 우리가 콧구멍 사진을 판별할때 듬성듬성한 코털 필터를 이미지 전체의 부분부분에 적용해서 해당 특징은 아 콧구녕의 특징을 가지고있구나! 라고 느끼는게 아닐까 싶다. 

다만 콧구녕은 다른 특징들도 가질수 있기 때문에 필요하다면 한개의 공유행렬이 아니라 여러개의 공유행렬, 즉 한개의 커널이 아닌 두개이상의 커널을 적용시켜야 하지 않겠는가. 이렇게 특징맵들이 모여있는것이 합성곱 계층이라고 한다. 


다만, 합성곱 계층 외 풀링 계층이라는것도 존재하는데 이는 합성곱 계층의 출력값을 단순화시켜준다고 한다. 콧구녕을 자꾸 예로들어서 미안한데, 사실은 코털의 행렬이


0 0.85 

0 0


0.9 0

0 0.1


이러한 식으로 나열되어 있으면 사실은 우리가 필요한건 1이 적혀진것 아니겠능가. 즉 듬성듬성한 가운데서도 뿅 나와있는게 우리가 원하는 결과라는 것이다. 따라서 2*2 행렬이라고 할때 맥스풀링 바법을 이용하여 제일 큰값만 취하고 정보를 압축할수가 있다는 것이다.


결론적으로는 어떠한 특징이 이미지 부분부분 나타난다면, (코털이 듬성듬성 나타난다면?) 이의 절대적인 위치가 아닌 다른 코털과의 상대적인 위치가 중요해질뿐이라는 사실이다.


아래는 전체적인 코드. (IPyhon의 경우, 역자의 깃허브에서 발견 가능하다. https://github.com/rickiepark/first-steps-with-tensorflow)




한번 다시 복습을 해본다.


합성곱 신경망에서는 가중치와 편향을 초기세팅을 한다. 스트라이드와 패딩, 맥스풀링을 위한 것들은 당연히 해야되는것이며, 데이터 로딩까지는 쉽다.


예제에서는 콘볼루션 레이어를 계속 통과시키는데, 처음은 5*5 윈도우를 가지고 총 32개의 필터를 가지고있도록 세팅하며, 흑백 2가지만 있으므로 크기는 1로 정한다. 


다음 콘볼루션 레이어는 총 필터가 32개였으므로 이 부분이 32로 늘어나며 64개 필터를 가지도록 세팅한다. 마지막 절차는 맥스풀로 정보를 압축해주는 일.


그 이후, 최종적으로 결과를 출력하기 전에 1차원 텐서로 연결하여 전달한다.


최종적으로 아래와 같이 계속해서 학습이 되면서 정확도가 높아간다. 


다만, 시간이 내가 쓰는 맥북에서는 한세월이다.. 예상 정확도는 96~99 퍼센트.



step 0, training accuracy 0.06

step 1000, training accuracy 0.98

step 2000, training accuracy 0.96

step 3000, training accuracy 1

step 4000, training accuracy 0.98

step 5000, training accuracy 0.98

step 6000, training accuracy 1

step 7000, training accuracy 0.96

step 8000, training accuracy 0.98

step 9000, training accuracy 0.98

test accuracy 0.9917




반복적인 학습으로 정확도가 개선된다. 최종적으로 테스트를 통한 정확도 개선은 99퍼센트까지 치솟는다.

다만, 아래와 같이 맥은 터질지도 .. 2009년형 맥북은 너무 힘들어한다...미안하다.. 혼란하다 혼란해..약 2시간이 걸렸다.