본문 바로가기

ML/딥러닝

Convolutional Neural Network

탄생 배경.

컴퓨터 비전은 인공지능 이전부터 연구되어 왔는데, 룰 베이스 알고리즘(규칙을 찾는거지. 파라면 하늘 이런느낌)을 탑재한 컴퓨터 비전이엿다가

딥러닝의 발전 이후로 엄청난 성장을 하고 있다.

 

과거 cv는 이미지 특징점을 추출하는 방식으로 이미지 일부 정보만을 사용, 

같은 특징점을 가진다면 문제 발생.

여러 특징점을 가지고 오분류 최소화하려고 함.

 

이제는 딥러닝은 픽셀자체를 정보로 다 활용해버려 버리는게 없지. 비효율적이지만 (커ㅓㅁ퓨팅 관점에서) 하지만 정확도가 개선돼 .

 

cnn

자동특징추출기인데, 사람의 얼굴이라고 예를 들면 cnn이 과거였으면 사람의 얼굴에 특징점들을 분류해야겠지만 cnn이 발전된 현재는, 컴퓨터가 특징을 찾아내 전반적인 쉐입과 특징을 보는것이 cnn의 원리야 사람처럼 보는게 아니라 

2차원 데이터를 처리하기 땜누에 일반적인 신경망 모형 ( 1차원) 에 비해 유리하지ㅣ.

엠니스트에서 원래 2차원인데 1차원으로 바뀌면서 공간적 관계가 깨져, 

 

cnn의 처리과정

크게 두과정이다.

첫번째는 이미지로부터 특징을 추출하는거 feature extraction  >> 피쳐를 이용하여 딥러닝 수행

특징 추출은 컨볼루셔널 레이어를 이용하여 이미지의 특징을 추출하고 풀링 래이어 에서 대표값을 만드는 과정을 반복하여 특징을 단순화해간다.

단순화된 특징은 이미지를 구별할수있는 간결한 특징만 남고 판병에 도움이 되지 않는 자세한 이미지 정보는 삭제

cnn은 사람이 이미지 인식하는 과정과 유사

전체학습이 아니라 몇개 특징만 보고 학습하는거니깐.

 

과거는 이러한 핵심정ㄱ 특징을 수치로 표현하고 수치를 분포차이를 이용하여 이미지 인식했는데, 이러한 피쳐를 만들어내는것은 엄청난 시간이 들고 불편한 작업이다.

 

두번째는 분류이다.

 

 

convolutional layer 

 

이미지는 3채널이 있어 세가지 색깔 RGB 

칼라 이미지 1장에 width * height * 3 의 픽셀의 정보가 있는 것이지.

 

rgb는 0~255 값 (0 검정 255 단색.)

 

이제 이러한 이미지에 필터를 끼워보자 작은 필터 

필터를 통해 이미지를 볼 것이다. 

예시로 이미지 32 * 32 * 3  를 3 * 3 * 3 필터로 정보를 하나의 값으로 변환하여 정보를 축약한다.

필터로 본 이미지도 3 * 3 * 3 이고 필터도 3 * 3 * 3  이를 곱해서  다 더해서 하나의 값이 돼.

이런식으로 처리를 하는거지.

 

예시 

4 x 4 x 3 이미지를 3x3x3필터로 피쳐맵을 구해보자

필터와 채널 값을 엘레멘트와이즈 곱을 구한후 더해서 하나의 값을 만들고 이를 세 채널에 대 해 반복하여 모두 더하면 하나의 값이 생성된다 이제 필터를 이동하여 계산하면 피쳐 맵ㅇ 완성.

 

 

이제 예시는 7x 7   필터 3x3 그러면 이동시키면 5개 생기지 오른쪽이동만 생각할때 , 

그러면 7x7을 3x3으로 통과할때 5x5생긴다는걸 알수잇어

그래서 이동회수는 (n-f)/stride + 1이다. 

stride는 몇칸씩 필터 이동시킬거냐 

한칸씩이동하면 5x5생기고 

stride 2인 두칸씩 이동하면 3x3 생기겟지 

원본 이미지의 차원은 필터 통과하면서 점차 줄어들어 작은 이미지로 변환.

 

패딩

 

패딩은 뭐냐~? 필터 씌워서 이미지 사이즈 줄어드는걸 방지하는방법이야

우너본 이미지 주변을 0으로 둘러서 필터 작업 해도 이미지 사이즈 안줄어들도록 만드는 거지 이미지 사이즈를 키우는 그런 느까ㅣㅁ 

그리고 제로패딩의 사용 이유는 0을 포함팜으로써 가장자리를 알수 있게 돼

 

필터크기에따라

필터 작으면 작은특징

커지면 큰 특징을 보게 되는 느낌 

레이어마다 특징이 달라져 .

 

1x1 필터 효과

연산량 줄어들어/

1x1 convolution 이라고만 말하지 않고, filter 수(차원의 수, 채널의 수와 혼용된다.)라는 것이 함께 말해야 의미가 있다.

 

사실, 입력하는 채널의 수와 출력하는 채널의 수가 완전히 동일하다면 convolution의 큰 의미는 없을 것으로 생각된다. 하지만 차원의 수를 바꿔준다면! 이야기는 달라진다. 차원을 크게도, 그리고 작게도 만든다. 입력받는 것에 비해 적은 수의 차원으로 채널의 수로, filter의 수로 만들어 준다면- 차원이 축소된 정보로 연산량을 크게 줄일 수 있다. 한번 이렇게 줄여 놓으면 뒤로가면 연계되는 연산량의 수, 파라미터의 수가 확 줄어들기 때문에 같은 컴퓨팅 자원과 시간 자원으로 더 깊은 네트워크를 설계하고 학습할 수 있게 된다. 그런데, 차원을 단순히/무작정 작게만 만든다고 다 되는 것은 아니다. 적당한 크기가 필요하고, 그 다음의 레이어에서 학습할 만큼은 남겨둔 적당한 차원이어야한다. 이러한 구조를 잘 활용한 것이 bottleneck 이라는 구조이다.

 

풀링 레이어

하나의 convolution layer를 이용하여 풀링 레이어 만들어 컨볼루션 레이어를 하나씩 뽑아서 이미지를 대표 값으로 요약하는 과정

가장 큰 값을 샘플링하는 맥스풀링도 있고,

평균도 ,, 최소값도,,, 자주쓰는 보통 쓰는게 맥스 풀링

만약 4x4이미지를 2x2필터로 2stride하게 된다면 그러면 2x2가 되겠지

 

이미지 1,4,4,3

장수, w h 채널수(색깔)

웨이트 

2,2,3,1

필터 픽셀 두개, 색깔, 필터수

padding same 하면 4 ㅌ 4 

padding valid 

 

 

렐루 함수 계속 껴있는 이유는 피쳐맵 만들때 사실 렐루 거쳐서 나오는거였음!

 

마지막에 풀리 커넥티드 레이어로 2차원을 1차원으로 결과값을 도출해 무슨 객체인지 인식하는거지.