예전부터 한번 즈음 있었으면 좋겠다 생각하는, 뱅킹 앱의 위젯전부터 한번 즈음 있었으면 좋겠다 생각하는, 뱅킹 앱의 위젯에 대한 컨셉을 잡아보려고 한다. 체크카드를 사용하는 사람들은 한번 즈음은 느껴봤을 법한 단순한 불편함. 바로 본인의 체크카드가 연동된 계좌에 대한 잔액을 확인하는 것이다.
한번쯤 불편함을 느껴보지 않았을까? 물건을 사려다 내 통장 잔고가 잔액이 없어 다른 카드를 찾아야 할 때, 혹은 잔액을 옮겨 결제를 하기위해 앱에 들어가 카운터 앞에서 송금을 해야할때 말이다. 그럴때 다들 한번 쯤 생각한다. 바로바로 언제든 내 주사용 카드의 잔고를 알고싶다고. 그래서 한번 위젯을 한번 만들어보는게 좋지 않을까 하고 생각했다.
- Small Size
내가 설정한 주 계좌에 대한 잔고 내역을 알려준다.
- Middle Size
내가 설정한 주 계좌와 부계좌에 대한 계좌 내역 및 잔액을 알려준다.
- Large Size
내가 설정한 주 계좌의 잔액과 최근 5건의 거래내역. 그리고 한달간의 소비 패턴을 보여주는 지출 비율을 나타내준다.
구체적인 디자인과 기능들의 상세안은 앞으로 상세 기획안에서 디테일을 챙겨보려고 한다. 추가적으로 위젯에 자동이체 일자라던가, 내가 자동결제를 연동해둔 구독결제일자를 조금 정리해서 나타내주면 조금 더 밀도 있는 위젯이 될 것 같다.
이번에는 Naver의 선물하기 서비스이다. 보통 비슷한 서비스를 제공하는 경우, 기존 존재하던 서비스와의 차별점이 존재하기 마련이다. 그리고 그러한 차별점이 이용자에게 이용 욕구를 자극하는 경우가 많다.
이번 벤치마킹의 목적은 두 서비스간의 차이점을 분석하고, 각 서비스가 가진 장점등을 통해 주 타겟 고객층에 대한 인사이트를 도출해보고자 한다. 이용자의 특징을 카테고리화 하면, 조금 더 특화된 서비스를 만들수 있고 이에 대한 방향성을 잡기에 중요하다고 개인적으로 생각한다.
1. 접근방식
KaKaoTalk의 '선물하기'는 앱과 PC버전 두가지 모두 접근이 가능하다. 친구 프로필탭, 대화창, 더보기, 선물하기 채널 등 다양하게 접근이 가능하다. 이떄, PC버전은 웹검색창에 카카오톡 선물하기를 검색하여 추가로 접근이 가능하다.
반면에 Naver의 선물하기 기능은 카카오톡과 다르게 네이버 스마트스토어 내부의 하나의 기능과 항목으로 제공 된다. 네이버 또한 앱/웹 모두 접근 가능한데, 선물하기 기능을 별도로 운영하는 것이 아니기에 네이버 스마트스토어로 접속하여 이용이 가능하다.
>> 접근방식을 통해 사용자 경험의 차이는
카카오톡 : 나와 관계를 맺은 사람에게 마음을 전하는 수단
네이버 : 상품 쇼핑 중 발견한 상품을 효율적으로 전달하는 수단
라 생각한다. 왜냐하면, 카카오톡의 정체성은 메신저이기 때문에, 대화를 나누는 상대와 사회적 관계를 맺은 사람이다. 그렇기 떄문에 그런 관계를 발전/유지하기 위한 수단으로 제공하는 기능이라는 생각이 강했다.
반면에, 네이버의 경우 스토어에 접속하여 다양한 제품을 탐색하고 쇼핑하는 과정에서 괜찮은 물건을 발견한 경우에 발생한다. 즉, 이미 관계 형성이 이루어진 관계를 중심으로 사용하는 소비의 추가적인 기능으로 생각 할 수 있을 것 같다.
2. 선물 전달 및 알림 방식
카카오톡과 네이버 선물하기의 가장 큰 차이점이라고 볼 수 있는 영역이라 생각한다. 선물하기를 통해 결제 이후 상대방이 선물을 확인하는 과정까지의 방식이 유사한 듯 하지만 이용자에게 있어 체감을 크게 느낄 수 있는 대목일 듯 하다.
카카오톡의 경우, 카카오톡 메신저를 통해 1:1 대화로 채팅방에 선물 알림을 직접 전송하여준다. 그리고, 선물받은 이력은 상대방의 선물함에 저장되어 언제든 확인이 가능하다. 다만, 카카오톡의 경우에는 카카오톡 채팅방이 개설된 사람이거나, 친구목록에 있는 사람만 선물이 가능하다.
그런데 네이버는 자신이 전화번호만 알면 전송이 가능하다. 즉, 선물 대상의 범주가 좀 더 크게 지원이 된다. 카카오톡을 가끔가다 사용하지 않는 유저가 있다. 그러나 포털 사이트는 이용하지 않는 사람은 드물다. 특히, 국내 사용자의 경우 네이버를 사용하는 사람은 대부분을 차지하기 때문에 조금더 다양한 사람에게 선물이 가능하다.
다만 아쉬운점은, 선물을 받은사람은 선물 받은 이력을 네이버 아이디로 보내는 경우에는 네이버앱의 Push 알림으로 전송한다. 이것이 조금 아쉬운 점으로 꼽는다. 대부분 이용자는 상단바에 뜨는 알림을 유심히 확인 하지 않고, 아이콘으로만 판단하는 경향이 짙다. 즉, 선물하기의 사실을 제대로 확인하지 않고 광고성 알람이라고 생각할 경우가 존재한다. 네이버도 이러한 점을 인지했는지, 선물을 보내는 발신자가 알림을 다시 보낼 수 있는 기능을 지원한다.
네이버에서도 해당 문제점을 인지하여 다음과 같은 Q&A를 게시했다.
>> 개인적으로 네이버 아이디로 보내더라도 알람방식을 문자메세지로 전송을 해준다던가, 조금 확인을 명확하게 할 수 있는 방식을 해주었으면 좋겠다. 아니면 PUSH 알람처럼 작게 보내는 것이 아니라, 네이버 접속 시 팝업창으로 바로 선물이 도착했다는 사실을 알려주는 것도 좋은 방식일 것 같다. 혹은 네이버아이디로 보내더라도 문자로 발송을 함께 해주었으면 한다.
두 서비스 모두 공통된 아쉬운점이 존재했다. 바로 예약하기 기능이 없다. 선물하기 기능의 주된 사용 이유는 바로 '생일' 과 같은 기념일의 축하다. 대부분 이용자들 그러한 기념일을 챙기기 위해 특정한 시간대에 자신의 선물을 전송하기를 원한다. 검색창에 예약이라는 키워드로 검색하면 대부분 선물하기 기능을 이용하는 사용자들은 어렵지 않게 발견 할 수 있다.
카카오톡의 경우 비록 기업용 계정의 경우 예약하기 기능을 지원하고 있으나, 개인용은 지원하지 않는다. 우회적으로 결제 상품권을 이미지로 저장하여 예약전송을 하면 되는 방식으로 가능하나. 이 경우는 이전의 다른사람에게 받은 선물을 돌려막는 이미지가 있어 대체적으로 받는 사람이 오해하는 경우가 발생한다.
'선물'은 이용자의 마음을 전달하는 사회적 행동이다. 선물이라는 새로운 소비 행태는 그 마음이 보존될때 비로소 발생한다. 1분 1초를 바쁘게 살아가는 현대 사회에서는 소중한 순간을 놓치고 싶지 않지만 그 시간을 온전히 지키기는 매우 어렵다. 즉, 이러한 결핍의 순간을 해소하여준다면 조금 더 많은 소비를 진작 할 수 있지 않을까 한다.
사용자가 상대방에게 선물하고 싶은 상품을 구매하여, 상대방에게 기프티콘(교환권)이나 배송지 입력을 할 수 있는 메세지를 전송하여 선물을 전달하는 서비스이다. 조금 더 구체적으로 이야기하면, 사용자가 선물하고 싶은 상품을 '선결제'를 통해 상품의 권리를 상대방에게 선물하는 방식의 서비스이다. 기존의 선물은 현물거래 였는데, 이제는 간편하게 시간장소에 구애받지 않고 간편하게 선물을 전하는 것이 자연스럽다.
2. 서비스 선정 계기
'선물하기' 기능을 선정하게 된 과정은 단순했다. 너무 자연스럽게 사용하기 때문이다. 자연스럽다는 것은 사용빈도가 높다. 그렇다는 것은 그만큼 서비스의 완성도나, 제공품질 등 잘짜여진 서비스라고 생각할 수 있다. 이러한 서비스를 분석하는 것은 성공사례를 볼 수 있는 기회라고 생각했다. 또한, 잘짜여진 서비스라도 항상 개선점은 존재한다. 그런 부분을 세밀하게 관찰해내는 시각을 가질 기회라고도 생각하여 선정하게 되었다.
3. 실사용 분석
(1) 진입경로
카카오톡 '선물하기' 기능은 다양하게 접근이 가능하다. 친구목록, 대화창, 더보기 창을 통해 접속이 가능하다. 여러 곳을 통해 배치한 이유는 각 경로에 따라 의미가 있다.
친구목록
: 카카오톡으로 친구추가가 되어있는 사람들의 생일에 맞추어 알림을 띄워주는데, 생일 선물을 선물하기 기능을 통해 할 수 있도록 유도한다.
채팅방
: 대화도중 소소한 선물을 할 때가 많은 경우 주로 이용하는 사용자들을 타겟팅 한 듯 보인다. 아무래도 대화 도중 선물 할 수 있도록 빠르게 접근 할 수 있게 하는 것 같다.
더보기
: 내가 받은 선물을 확인하거나, 선물하기 기능을 바로 이용할 수 있도록 만들어 두었다. 예전에는 받은 선물을 확인 할때 선물하기를 통해 확인해야 했으나, 업데이트를 통해 받은 선물함을 바로 확인 할 수 있도록 분리한 듯 보인다.
선물하기 메세지
: 카카오톡에서는 채널메세지를 통해 주기적으로 선물하기에 있는 제품을 홍보하는 광고성 메신저를 보낸다.
(2) UI분석
- 메인 홈화면
상단에 최근 생일인 친구들의 목록과 받을 수 있는 쿠폰의 혜택을 보여준다. 대체적으로 많은 이용자들이 선물하기 기능을 '생일선물'을 위해 사용하기 때문에, 이런 UI 배치를 하는 듯 하다. 보통 가장 잘보이는 곳에 노출하는 컨텐츠는 서비스 제공에서 중요도가 높기 때문이다. 여기서 한가지 흥미로운 점은 보통 생일은 당일에 해당하는 사람을 챙겨주기 마련이다. 하지만 선물하기 기능에서는 지난 사람의 생일도 띄우는데, 지나간 소중한 친구의 생일을 챙겨주도록 유도하여 서비스를 이용하게 하는 전략이 돋보인다.
두번째로는 보이는 항목은 선물 카테고리와, 선물랭킹이다.
사용자 경험을 잘 표현 했다고 느끼는 대목이다. 보통 선물을 고르다가 결국 포기하는 유저의 경험을 반영하듯 나이대 별로 정리해둔 인기도에 따라 보여준다. 그래서 선물로 고민하는 사람들이 대체적으로 자주 구매하는 것 또한 유추가 가능하다. 한번쯤은 선물로 골머리를 앓은 사람들을 잘 저격한 듯하다.
마지막으로 위시리스트 기능이다. 해당 기능은 선물하고자하는 사람의 프로필이나 대화방에서 선물하기 접속하거나, 선물하기 창에서 직접 지정하면 나타난다. 바로 자신이 받고 싶은 선물을 나타내는 기능인데, 보통 선물을 받을때 가장 어려운 질문이 '뭐받고 싶어?' 일 것이다. 선물을 받는 사람은 상대방의 경제적 여건과 모든 상황을 고려하여 이야기하는 피로도가 있다보니 조금 꺼리는 질문인데, 이 기능은 모두에게 이점이 된다. 선물을 받는 사람은 부담없이 갖고싶은 선물을 올려둘 수 있고, 선물을 구매하는 사람은 자신의 경제적인 여건 멎추고 상대방의 의견없이 바로 구매할 수 있는 이점이 있다.
대체적으로 메인 홈화면은 '선물하기'라는 이름에 걸맞게, 생일이라는 특수한 상황을 1순위로 상정하고 만든 느낌이 강하다. 우리의 입장에서는 생일은 1년에 한번돌아오는 특별한 날이지만. 기업의 입장에서는 생일은 1년 365일 계속되는 상황이니까 말이다.
- 결제 화면
결제면은 조금 단순하다. 원하는 선물을 결제하면, 메시지로 선물을 보낸다. 이 선물은 상대방의 받은 선물함에 보관되어 언제든 확인 할 수있다. 그런데 여기서 당연하지만 그래도 짚고 넘어가면, 결제 수단과 배송지입력, 제품변경은 이야기하고 싶다. 결제수단은 여러가지를 제공하면서 자사의 기능은 카카오페이를 상단에 띄운다. 이는 자연스럽게 자사의 서비스를 추가적으로 이용하게 하려는 전략인데, 이러한 방식을 부담없이 제공하는게 매력적이다.
그리고, 배송지 입력과 제품변경에 있다. 아무래도 온라인 택배등을 통해 선물을 주는 경우 배송지 입력에 대한 문제가 남아있고, 같은 제품이라도 종류가 다양하다면 받는 사람의 취향에 따라 또 골라야하는 피로가 있다. 하지만 선물하기 기능은 굳이 배송지를 입력하지 않아도 받는 상대방이 주소를 입력하게 할 수 있으며, 원하는 옵션 역시 바꿀 수 있다. 참 생각을 깊게 했다는 부분이 들었던 서비스 기능이다. 선물을 주는 사람은 입력에 대한 불편함을 겪지 않아도 되고, 선물 받는 사람은 자신 취향대로 선물을 고를 수 있으며, 선물을 받는 배송지 또한 받는 사람에 의중대로 할 수 있는 자유를 준 것이니 말이다.
4. 좋은점 / 아쉬운 점
(1) 가벼운 선물부터 명품까지 스펙트럼이 넓다
생각보다 다양한 제품들이 입점에 있어 주고싶은 선물이 없어 주지 못하는 경우는 드물다. 그 사람이 정말로 필요할 것 같은 선물부터, 부담없이 줄 수 있는 가벼운 선물 등 주고싶고/받고싶은 선물을 주기에는 좋은 스펙트럼이다.
(2) 선택의 폭이 넓은 만큼 선물 고르기 힘들다
하지만, 스펙트럼이 넓다는 것은 반대로 선택하기가 너무 힘들다는 양면의 단점도 존재한다. 랭킹과 추천이 아닌 자신이 직접 고르고 싶은 사람의 경우는 무엇을 골라야 할 지, 경우의 수가 너무 많다는 것이다. 그래서 고민에 고민을 거듭하다 이탈해버리는 사용자도 적지않게 있을 것 같다.
(3) 선물랭킹으로 인한 선물 종류의 고착화
선물랭킹을 보면 상위권의 상품이 대부분 '상품권'과 '치킨' 이다. 아무래도 방금전에 말한 고르고 고르다 포기해버린 사람들이 많이 찾는 상품이라는 것을 반증하는 사례이다. 이러한 점은 받는 사람에게 있어 무성의한 선물로 조금 비쳐지기도 한다.
(4) 광고메세지에 대한 피로가 존재한다
매일에 한 건이상 광고성으로 채널메시지기 온다. 이러한 광고성 메신저는 사용자에게 홍보 효과가 있지만. 반대로 너무 주기적으로 오는 메신저로 인해 사용하지 않는 사람들에게 피로도를 불러 일으킨다.
족장님 말에서 서운함이 가득 묻어 나오신다. 걱정마요 혼공학습단이 그만큼 매력적이라 끊지 못해 온겁니다.
내가 말했던 것은 그만큼 혼공학습단이 얻어가는 것이 너무 많아 열심히 할 자신이 없다는 나의 의도가 왜곡이 되어버렸다.
역시 이래서 한국말은 'ㅏ'다르고 'ㅓ'다르다는 말이 이래서 나온게 아닌가 싶다.
1. 패션 상품 이미지 분류하기
저번주에는 딥러닝 모델 중 합성곱신경망의 구조에 대해 알아보았다. 이제는 그 합성곱 신경망을 활용하여 해당 모델의 주특기인 이미지 분류를 해보도록 하자.
(1) 활성화함수
우선 모델을 만들기 전에, 활성화 함수라는 것에 대해 짚고 넘어가자. 활성화 함수란, 뉴런의 출력값을 결정하는 함수이다. 해당 함수를 입력값이 통과하면, 입력된 값에 비선형성을 부여하게 되는데 이는 복잡한 분류/회귀 문제를 해결할 수 있는 장점이 있다.
"선형, 비선형 그게 도대체 뭔데"
선형, 비선형 말은 많이 들어봤지만 이야기가 조금 모호해서 힘들수 있다. 선형/비선형은 수학에서 등장한 개념인데, 선형이라는 것은 영어로 "Linear"라는 단어로, 말 그대로 '직선'이라는 뜻이다. 그럼 반대로 비선형성은 직선이 아닌 것, 쉽게 생각하면 곡선이라는 것이다. 우리는 데이터가 존재하면 그것을 좌표평면상에 점으로 표현할 수 있는데. 그 데이터가 분포한 패턴을 하나의 그래프인 '선'으로 그릴 수 있지 않은가? 수학에서는 이를 수식으로 표현 할 수 있는 소리가 된다. 이때, 만약 데이터를 하나의 '직선' 으로 표현할 수 있다면 '선형'성을 갖고 있다하고, 직선으로 표현이 안되고 곡선으로 표현할 수 있다면 '비선형성'이라고 생각하면된다.
그림을 통해 보면 왼쪽은 직선으로 데이터의 분포를 잘 나타낼 수 있다. 이것이 바로 선형성이다. 그러면 자동으로 오른쪽은 비선형성을 갖는다고 볼 수 있다.
자 다시 딥러닝으로 돌아와서, 세상의 모든 데이터가 직선으로 표현할 수 있다면 좋겠다만, 현실을 비선형성을 지닌 패턴이 더 많다. 그렇기 때문에 이를 제대로 학습하기 위해서는 비선형성을 부여할 수 있는 활성화함수가 도움을 줄 수 있다는 것이다. 모델이 잘 학습이 되었다면, 즉 수식이 잘 만들어졌다면 우리는 데이터를 집어넣는 '딸깍' 한번에 모든 현상을 분류하고 예측할 수 있다는 것이다.
대표적인 활성화 함수로는 sigmoid, ReLU, tanh, softmax 함수 등이 있다.
(2) LeNet-5 만들기
이제 활성화 함수에 대해 알아 보았으니 본격적으로 LeNet-5 모델을 만들어보자. 우리는 파이썬 Keras 라이브러리를 통해 쉽게 만들수 있으므로 이를 활용하여 만들어 보겠다.
import keras
from keras import layers
lenet5= keras.Sequential()
lenet5.add(layers.Input(shape=(28, 28, 1)))
lenet5.add(layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', padding='same'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Flatten())
lenet5.add(layers.Dense(units=120, activation='sigmoid'))
lenet5.add(layers.Dense(units=84, activation='sigmoid'))
lenet5.add(layers.Dense(units=10, activation='softmax'))
모델이 잘 만들어졌으니, 요약을 통해 어떻게 구조가 되어있는지 확인해보자.
conv2d_4
🟦 합성곱층
3×3 필터 6개 사용, 특징 추출
average_pooling2d_4
🟩 풀링층
2×2 평균 풀링
conv2d_5
🟦 합성곱층
5×5 필터 16개 사용
average_pooling2d_5
🟩 풀링층
2×2 평균 풀링
flatten_2
- (전처리)
2D → 1D 변환
dense_6
🟨 밀집층
400 → 120
dense_7
🟨 밀집층
120 → 84
dense_8
🟨 밀집층
84 → 10 (출력층)
라고 보면 된다. 각 파라미터는 전시간에 학습을 했으니 코드를 보면 알 수 있다.
2. 훈련 데이터 준비하기
(1) MNIST 데이터셋
우리는 만들어진 모델을 MNIST 데이터 셋을 통해 시험해보려고 한다. 해당 데이터 셋은 딥러닝을 처음 배우는 사람들이 자주쓰는 데이터 셋으로 유명한 데이터셋이다. 데이터 크기 및 개수가 동일하나 여러 종류의 옷 이미지들이 있어 활용하기 쉽다는 장점이 있다. 해당 데이터셋은 Keras 라이브러리에 datasets 모듈 아래에 이를 부를 수 있는 함수가 내장되어 있어 이를 활용하자.
(train_input, train_target), (test_input, test_target)= keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape) #불러온 데이터셋의 개수를 알수 있다.
#해당 데이터셋에 어떤 이미지가 있는지 확인하기
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 10, figsize=(20, 3))
for i in range(10):
axs[i].imshow(train_input[i], cmap='gray_r')
plt.show()
데이터셋에 어떤 이미지들이 있는지 파악이 됐다. 이제 훈련을 시켜서 모델을 시험해봐야하는데, 들어가기전에 우리는 몇가지 작업이 있다. 바로 타겟이 원-핫 인코딩이 적용되어있는지, 그리고 해당 데이터 마지막 차원에 1을 추가해야한다. 마지막으로는 모델의 최적화를 위해 검증세트가 필요하므로 이를 만들어야한다.
일단 먼저 넘파이배열의 reshape() 함수를 이용하여, 마지막 차원에 1을 추가하고 모든 데이터 값을 -1과 1사이의 값으로 변환해주자. 왜냐하면 보통 신경망 모델의 경우 -1과 1사이에서 더 잘 작동하기 때문에 그렇다.
13기 혼공학습단을 끝내면서 과거의 ENTP적 기질로 일벌리는 걸 잘하는 나는 6개월 동안 변한 것이 없는 것 같다.
이렇게 여름 방학을 맞아 14기를 지원하는 것을 보면...
그래도 뭐 어쩌겠나 이미 신청한 것을 하다 보면 또 얻어가는 것과 성취감도 많겠지라는 생각을 하며,
14기 혼공단도 열심히 한번 해보도록 하자.
1. 최초의 CNN 모델
합성곱 신경망. 이름을 들으면 참 와닿지 않는다, 아무래도 전공자가 아니라면 해당 이름을 들어본적이 없을 것이다.
그렇다면 요즘 우리가 스마트폰에 없으면 아쉬운 기능인 FaceID 기능은 쉽게 알것이다. 바로 그 기능을 구현시켜주는 것이 CNN, 즉 합성곱 신경망(CNN) 이다.
(1) 최초의 CNN
CNN이 개발되기 전, 초기 형태는 페이스북의 얀 르쿤이 개발한 'LeNet' 이라는 것에 출발했다. 우편서비스에서 우편번호를 자동으로 인식하기 위해 이를 개발한 것인데, 이것이 지금까지 발전되어 우리는 현재 FaceID 등의 기술로 사용하고 있는 것이다.
(2) 인공신경망과 합성곱신경망
신경망이라는 단어는 사람의 뇌구조에서 한번쯤 들어 보았을 것이다. 즉, OO신경망 이라는 기술을 사람의 뇌구조를 그대로 본따 만든 기술이라 생각하면 된다. 우리는 일련의 사고과정을 통해 물체를 인식하고, 판단하고, 행동하는 것을 그대로 컴퓨터에서 할 수 있도록 했다는 말이다. 하지만 컴퓨터는 복잡한 인간의 사고과정을 이해할 수는 없으니, 용도와 목적에 따라 따로따로 분리하여 구조화 해두었는데 그 중, 우리가 한번쯤 들어본 '인공신경망(ANN)', 과 '합성곱신경망(CNN)'의 차이를 조금 알아보자.
- 인공신경망(Artificial Neural Network)
똑같은 신경망의 구조이지만 인공신경망은 텍스트 분류, 금융데이터 예측에 사용되는 신경망으로써 '입력층-은닉층-출력층' 구조를 거쳐 데이터를 처리한다.
- 합성곱신경망(Convolutional Neural Network)
이미지 처리를 위해 조금 더 특화한 인공신경망. '입력층-합성곱층-풀링층-밀집층' 의 세분화 된 층들을 거쳐 이미지를 분석하고 패턴을 학습할 수 있다.
[합성곱 신경망 각 층의 역할]
합성곱층 : 이미지의 작은 부분을 스캔하여 핵심 특성을 추출하는 층이며, 합성곱계산을 통해 얻은 출력을 특성 맵이라 한다.
풀링층 : 특성 맵을 축소하여 처리 속도를 높이고 조금 더 중요한 특성에 집중하도록 하는 층
밀집증 : 추출된 특성을 바탕으로 최종 결과 도출하는 층. 추출된 이미지 패턴을 바탕으로 분류 작업 수행
2. 합성곱신경망의 층 만들기_[추가숙제]
(1) 합성곱층
파이썬의 Keras 라이브러리를 통해 우리는 쉽게 합성곱신경망의 레이어들을 만들어볼 수 있다. 합성곱레이어는 이미지를 입력으로 받았을 때, 돋보기로 하나하나 살펴보며 패턴을 찾아내는 층이라고 생각하면 된다. 합성곱레이어에서는 대표적인 매개변수를 이해해야한다. '필터 수', '필터 크기', '스트라이드', '패딩' 에 대해 하나씩 살펴보자.
- Filter(필터)
필터는 돋보기의 역할에 해당하는 것이라고 보면 쉽다. 그러면 우리는 돋보기를 통해 몇개의 특징을 추출할 것인지, 어떤 크기의 돋보기로 볼 것 인지에 대한 정의를 해주어야하는데, 그것이 바로 필터 수와 필터 크기에 대한 파라미터이다.
- Stride(스트라이드)
스트라이드는 필터가 이동하는 칸 수를 말한다. 말그대로 돋보기가 차례차례 이미지를 훑고 지나갈건데, 하나하나씩 볼건지 몇개씩 건너 뛰면서 볼것인지를 결정해준다. 이때, 적절한 스트라이드를 설정하면 계산량을 줄이면서 중요한 정보를 추출 할 수 있다. 그러나 너무 작거나 크면 계산량이 너무 많아지거나 중요한 정보가 손실될 수 있다.
- Padding(패딩)
패딩이라는 것은 필터가 이미지를 훑으면서 가장자리의 정보는 완전히 덮을 수 없다. 이러한 문제로 출력 크기가 작아지고 가장자리에 해당하는 정보가 점점 소실되는데 이러한 점을 보완하는 파라미터이다. 기본적으로 Valid, Same 패딩이 있다.
import keras
from keras import layers
import numpy as np
#합성곱층 만들기
conv1= layers.Conv2D(filters=10, kernel_size=(3,3))
#합성곱층의 처리 과정
x = np.random.normal(size=(10, 28, 28, 1))
conv_out = conv1(x)
print(conv_out.shape)
#합성곱층의 파라미터 값에 따른 출력
conv2 = layers.Conv2D(filters=10, kernel_size=(3,3), strides=(2,2))
print(conv2(x).shape)
conv3 = layers.Conv2D(filters=10, kernel_size=(3,3), strides=(2,2), padding='same')
print(conv3(x).shape)
conv4 = layers.Conv2D(filters=10, kernel_size=(3,3), padding='same' )
print(conv4(x).shape)
(2) 풀링층
풀링레이어는 합성곱레이어에서 만들어진 특징맵을 받아 특징은 그대로 유지하면서 크기를 줄이는 층이다. 컴퓨터에서는 처리해야하는 데이터의 크기가 클수록 비효율적이고 복잡한데 이는 과적합의 위험이 있다. 하여 풀링층은 데이터의 크기를 줄여 계산을 감소시키고 과적합을 방지시킨다. 풀링 방법에는 평균과 최대 풀링 두가지가 있다. 이때 풀링층은 학습되는 가중치가 없어 새로운 특성맵을 만들지 않는다. 즉, 요약과 압충에 집중하는 레이어이다.
- 평균 풀링(Average Pooling)
평균 풀링은 지정된 크기의 영역에 있는 평균값을 사용한다.
- 최대 풀링(Max Pooling)
평균 풀링은 지정된 크기의 영역에 있는 최댓값을 사용한다.
(3) 밀집층
밀집층은 추출된 특징을 바탕으로 최종적으로 분류나 회귀등의 예측을 수행한다. 전형적으로 인공신경망처럼 작동하는 층이며 입력과 가중치의 dot product(내적)에 편향을 더하는 방식으로 값을 계산한다. 그리고 해당 값은 활성화 함수를 통해 결과를 마지막으로 조정하여 분류와 회귀를 수행한다.
3. 합성곱 연산
필자의 전공은 수학교육과 이므로, 조금 더 합성곱신경망에 대한 자세한 연산방식을 소개하려고 한다. 합성곱은 영어로 Convolution 라 하는데, 이는 수학에서 유용한 연산 방식이다. 합성곱은 다음과 같이 정의된다. 이때 함수 f를 우리가 입력하는 이미지의 값이라 생각하고, g를 커널이라고 생각하면 된다.
이때 t는 함수의 입력과 출력의 기준을 의미하는 것의 변수이며, 타우는 입출력을 이어주는 매개변수이다. 이러한 연산방식은 기본적으로 연속적인 값들이 입력(f)으로 주어졌을 때 우리가 적절한 함수 g를 잘 선택하여 컨볼루션 하게 되면 원하는 형태의 연속되는 신호를 출력값을 얻게 된다. 이러한 연산 특징을 이용하여 입력 값에 대하여 원하는 정보만을 추출할 수 있다.
분명 첫 혼공학습단을 신청했던 즐거움에 공지가 나오기도 전에 메일 못받았다고 문의 넣는 나였는데...
성질머리 급해서 메일부터 넣었던... 족장님 이거 열정이 가득한거로 참작부탁드려요 그만큼 열심히 했잖아 나
어느덧 이렇게 마무리가 된게 참 시원하고 홀가분하기도 하지만, 그만큼 조금 아쉽기도 하다. 시간이 조금 더 허락했다면 더 열심히 할 수 있을것이라 생각했,,, 는 난 항상 최선을 다했다. 이정도 노력이면 충분한 것 같다.
매일 새벽 나는 이렇게 공부했다... 대학원준비와 학부공부, 출근, 후에 혼공단 공부까지...
이제 학부 졸업을 앞두고 있는데다, 대학원을 진학하기 위해 준비중인 학생이라 하루하루를 매우 바삐 살고 있었다. 그런데 여기다가 혼공단까지 하게 되니 처음에는 정말 죽을 맛이었다. 시간도 없고, 할건 많고, 끝내긴 해야하고 결국 잠을 조금씩 헌납해가면서 해야할 일을 마무리 지었던 것 같다.(와중에 출근도 했다)
나는 사실 MBTI가 ENTP인데, entp의 대표적인 특징이 흥미가 생기면 뒤도 안재고 실행에 옮긴다는 것이다. 다만, P의 성향이 짙어 미룰때 까지 미루는데 참... 혼공단 재밌어보인다고 신청했다가 미래의 나는 매일매일 공부하면서 과거의 날을 욕했던 기억이 있다. (그래도 하고나면 재밌고 뿌듯했습니다..)
심지어 ENTP의 두번째 특징은 한번 시작하면 끝을 본다는 특징도 있다. 미루는데 어떻게 끝을 보냐고? 혹 시작이 반이라는 이야기를 들어보았는가? 바로 그말이다. ENTP는 시작이 반이 아니라 시작이 99.9%이다.. 시작만 했다면 완성까지는 그냥한다. 항상 시작이 문제인것이지....
요즘 민간인 사찰도 하나봅니다. 누가 내얘기 적어놨어
하지만 그래도 1주차 부터 6주차까지 결과적으로는 너무 뿌듯했고, 만족스러웠다. 우수혼공단도 해보고 6주내내 족장님에게 블로그 정리 잘한다고 칭찬도 듣고, 나름대로 만족할만큼 공부도 했고. 무책임하게 일을 벌렸으나 그래도 항상 결과만 좋으면 된게 아니었을까? 적어도 그렇게 생각한다. 달면 삼키고 쓰면 뱉는다고, 원래 결과가 안좋으면 과정이 좋으면 그만. 과정이 별로라면 결과만 좋으면 그만이다. 아무튼 그렇다.
6주과정 야무지게 끝내서 홀가분하다. 이글을 보는 여러분들도 한번쯤은 혼공책 한권사서 끝까지 해보는 것을 추천한다. 나름 공부하는 재미도 알게 되고, 열정과 끈기를 시험할 수 있는 좋은 기회일 테니까. 그리고 공부하는데 따라오는 보상은 덤이다. 두서없이 지난시간을 돌아보았지만 그래도 즐거웠다. 기회가 된다면 다음 기수에도 만나길 고대한다. 그럼 이만!