Deep learning/딥러닝 실전

CNN 이미지 처리 실전 (2)

Chemi___6_oj 2021. 7. 31. 00:47

이전 시간에 CNN 이미지 처리에 대해 실습을 해보았는데요

실습 중 몇몇 내용들에 대해 보충설명이 필요할 것 같아 (2) 편을 작성하게 되었습니다.

딥러닝을 공부하는 같은 초보자이지만 여러모로 공부에 도움이 되었으면 합니다 :)

 

아무 의미 없는 AI 사진~

one-hot encoding, label encoding


이전 글 3. 데이터 전처리 에서의 전처리에 대해 보충 설명해드리기로 약속했던 내용입니다.

 

기본적으로 데이터를 전처리해주는 것은 컴퓨터의 특성 때문입니다.

컴퓨터는 연산을 처리하는 '기계'입니다. 사람처럼 언어적 사고를  하지 않고

연산을 기반으로 모든 행동이 이루어집니다.

그렇기 때문에 넣어주는 데이터들도 연산을 할 수 있는 숫자의 형태로 표현되어야 하는 것입니다.

 

label encoding, one-hot encoding 같은 것들이 그러한 전처리의 일종입니다.

label encoding

label encoding 은 카테고리의 각 데이터마다 0 1 2 3... 등 숫자 데이터로 변환을 해주는 작업입니다.

이렇게 될 경우 주어진 데이터를 수치로 변환할 수 있고 컴퓨터는 이 숫자를 보고 이게 무슨 데이터를 의미하는지 이해할 수 있습니다.

아래의 사진처럼 Arch를 0으로 Tied Arch를  4라는 숫자로 변환시키면 컴퓨터는 0을보고 Arch 임을, 4를 보고 Tied Arch를 이해하는 것이겠죠. 

https://towardsdatascience.com/categorical-encoding-using-label-encoding-and-one-hot-encoder-911ef77fb5bd

 

one-hot encoding

one-hot encoding은 카테고리 개수만큼 원소 배열을 생성하고 정답인 값에는 1을 부여하고

나머지에는 0을 부여하는 작업입니다.

 

이 작업은 label encoding이 이루어진 이후에 사용할 수 있다는 특징이 있습니다.

각 데이터마다 고유값을 지정해 줄 수 있다는 장점이 있습니다.

주로 고유 특성을 부여해주어야 하는 자연어 처리에 이 작업을 많이 사용하곤 합니다!

 

https://towardsdatascience.com/building-a-one-hot-encoding-layer-with-tensorflow-f907d686bf39

 

summery

model.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
block_1_conv (Conv2D)        (None, 26, 26, 32)        320       
_________________________________________________________________
block_1_pool (MaxPooling2D)  (None, 13, 13, 32)        0         
_________________________________________________________________
block_2_conv (Conv2D)        (None, 11, 11, 64)        18496     
_________________________________________________________________
block_2_pool (MaxPooling2D)  (None, 5, 5, 64)          0         
_________________________________________________________________
block_3_conv (Conv2D)        (None, 3, 3, 64)          36928     
_________________________________________________________________
flatten (Flatten)            (None, 576)               0         
_________________________________________________________________
dense (Dense)                (None, 64)                36928     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 93,322
Trainable params: 93,322
Non-trainable params: 0
_________________________________________________________________

summary 결과 내용을 한 번 뜯이보겠습니다.

block_1_conv 레이어의 경우 (None, 26, 26, 32)로 이루어져 있습니다.

이는 ( batch_size 가 없고, x축(1차원), y축(2차원), 필터의 개수)을 의미합니다.

 

아래의 flatten 은 1차원으로 데이터가 줄어들었음을 확인할 수 있습니다.

3*3*64 = 576 이니까 맞죠??

 

그리고 dense layer에서 우리가 64, 10으로 설정해준 대로 차원의 개수가 줄어들었음을 알 수 있습니다.

마지막 10은 분류되는 최종 결과 카테고리의 숫자임을 알아두시면 좋습니다..!

 

다음은 parameter에 대해서 알아보겠습니다.

파라미터의 수는 입력 채널 * 필터의 폭 * 필터의 높이 * 출력 채널 수 + bias로 계산된 결과입니다.

 

block_1_conv 레이어에서는 저희가 3*3 필터를 적용하였음으로

 

1*3*3*32 + (bias 개수 32 개)로 총 320 개의 parameter가 생성됨을 알 수 있습니다.

 

그리고  block_1_pool에서 채널의 개수가 32로 그대로임을 확인할 수 있겠죠?

이 채널의 개수가 block_2_conv의 입력 채널의 개수로 들어오게 됩니다.

 

그래서 block_2_conv의 파라미터 개수는 32 * 3 * 3 * 64 + 64 = 18496이 됩니다!

 

그리고 마지막 dense_1 에서는 입력 채널 64 * 10 + 10으로 = 650개의 파라미터가 생성되게 됩니다.

 

 

 

이렇게 파라미터가 표시하는 개수의 의미에 대해서도 살펴보았습니다.

레이어가 제대로 쌓였는지, summary()를 통해 이러한 내용을 살펴보는 것도 좋은 방법입니다:)

 

 

 

 

혹시 궁금한 사항 있으시다면 언제든지 댓글로 남겨주시기 바랍니다..!

그리고 수정 사항이 있다면 언제든 알려주시면 감사하겠습니다!