티스토리 뷰

CNNs for Image Classification

- 지금까지의 내용을 정리해보면, convolutional layer는 regional pattern들을 이미지로부터 뽑아내었다.

- 그리고 그 이후 max pooling layer는 convolutional layer 이후에 등장하여 그 넓직함을 줄여준다.

- (넓직함을 줄이지 않으면 over-fitting 될 리스크가 있음)

- 이번엔 CNN 아키텍쳐를 설계하기위해 이 레이어를 나열하는 방법에 대해 알아보자.

- 이미지 분류를 통해 CNN을 조금 더 구조적으로 이해할 수 있음.

- 이 경우 CNN은 반드시 이미지 배열을 input으로 받아야한다.




- 랜덤한 이미지의 예시.

- 만약 현실 이미지(학습에 최적화 된 이미지가 아닌)를 사용한다면 매우 복잡한 문제가 있는데

- 우선 각 이미지마다 크기가 제각각이다.

- MLP에서와 유사하게, CNN은 고정된 크기의 input을 필요로한다.

- 따라서 가장 먼저 해야 할 작업은 고정시킬 크기를 지정하여 그 사이즈에 맞게

- 모든 input 이미지들을 re-size 해 주어야 한다.

- 따라서 각각의 이미지들을 정사각형으로 resize 해 주는 과정이 가장 일반적이다.

- 각 이미지의 크기를 2의 제곱꼴(2 by 2 와 같이)에 해당하는 정사각형꼴로 변환해준다.

- 예시로 진행해 볼 데이터 셋은 32 x 32 크기의 이미지들임.




- 어떠한 이미지건 컴퓨터에 의해 해석될 땐 3차원 배열로 인지됨

- 컬러 이미지(RGB 이미지)는 높이 x 너비 x 깊이 이렇게 3차원으로 들어오게 되고

- R, G, B 3개이기 때문에 뎁스 3으로 들어오게 되는것이다.




- 그레이스케일 이미지는 기술적으로 2차원이다(뎁스가 1).




- 컬러이미지나 그레이스케일 이미지 모두 항상 깊이값보다 너비와 높이값이 훨씬 크다.

- 이번에 설계할 CNN 아키텍쳐는 input 배열을 받아 

- 그 배열의 너비와 높이보다 깊이값이 훨씬 더 커지는것을 목표로 한다.




- 콘볼루션 레이어가 input으로 받아들인 배열에 대해서 네트워크를 거침에 따라 깊이값을 증가시킬것이고

- max pooling 레이어가 넓직함(spatial dimensions) 즉, 면적의 크기를 줄이게 된다.

- 이렇게 진행하는 이유에 대해서는 조금 나중에 다뤄보도록 하자.




- 작동원리를 알아보기위해 input 레이어가 연속된 콘볼루션 레이어를 통과한다는 사실을 인지하고 있어야 한다.

- 위 그림에서처럼 콘볼루션 레이어에서의 스택이 이미지에서의 넓직한 패턴(spatial pattern)의 hierarchy를 보여준다.

- 각 콘볼루션 레이어 마다 hyperparameter들을 모두 지정해줘야 한다.

- kernel_size는 일반적으로 2가 지정된다. 즉, 2x2 크기를 의미함.

- strides는 일반적으로 1이 지정된다. 디폴트값도 1임.

- padding은 'same'으로 설정하였을 때 훨씬 나은 결과를 리턴한다. 디폴트값이 'same'은 아님.

- 그러나 위와같이 stride를 1로, padding을 'same'으로 주게되면 

- 콘볼루션 레이어의 높이와 너비가 이전 콘볼루션 레이어와 동일해지게 된다.

- 콘볼루션 레이어는 각 필터당 하나의 activation map을 갖기 때문에

- 필터의 개수는 콘볼루션 레이어의 뎁스에 영향을 주는 인자다.

- 따라서 대개의 경우에 있어 점진적으로 필터의 수가 증가하게 설계를 해줘야 한다.

- 첫번째 콘볼루션 레이어엔 input shape에 해당하는 값을 인자로 넘겨줘야한다.

- 그리고 모든 콘볼루션 레이어엔 ReLU function을 적용시커야 한다.




- 위의 설계를 토대로 코드를 작성하여 네트워크를 구현해보면, 

- 점진적으로 뎁스가 증가하지만 높이와 너비엔 변화가 없는 모델을 만들어 낸 것을 확인할 수 있다.

- input은 위 과정에 있는 모든 레이어에서 동일하게 32x32 크기임을 확인할 수 있다.

- 하지만 뎁스는 16 → 32 → 64 로 점차 증가하고있다.

- 여기까지는 높이와 너비가 모두 32로 동일한데, 

- 높이와 너비 또한 줄어들도록 하기위해 max pooling 레이어를 사용해보자.




- 일반적으로 매 콘볼루션 레이어마다 하나씩 max pooling layer가 들어가거나 두개당 하나 꼴로 들어간다.

- 보통 pool_size 와 stride 를 둘다 2로 주는데, 

- 이렇게 하면 넓직함(spatial dimension)을 이전보다 반으로 줄이는 효과가 있다.

- 이렇게 콘볼루션 레이어와 max pooling 레이어의 조합으로 

- 뎁스가 깊은(뎁스값이 큰) 그리고 매우 작은 높이와 너비를 가진 배열을 얻어낼 수 있다.

- 이제 어떻게 이 넓직함이 변하는지 Keras에서 직접 구현해보도록 하자.




- 뎁스는 이전과 마찬가지로 증가하고 있고,

- max pooling 레이어를 더해주자 넓직함 즉, 높이와 너비가 점차 감소하고 있다.




- 공간적 정보가 들어있는 원본 데이터를 받아와 이미지의 공간적 정보(옆 픽셀과의 관계)를 손상시키며

- 이미지의 정보를 인코딩하게 된다.

- 최종적으로 리턴되는 output을 확인해보면 배열상의 엔트리끼리의 공간적 관계는 더이상 확인할 수 없다.

- 대신, 각 필터가 이미지로부터 추출해 낸 패턴으로 채워지게 되어서

- 바퀴가 있는지? 눈이 있는지? 다리가 있는지? 꼬리가 있는지? 에 대한 정보를 담고있다.




- 더이상 공간적 연계성이 없는 데이터를 얻게되면, 이 배열을 벡터로 flatten하여 

- 하나 이상의 완전하게 연결된(fully connected) 레이어에 input으로 줘서 

- 이 이미지가 어떤 객체(object)를 가지고 있는지 결정하게 할 수 있다.

- 당연하게도 모델이 위와같이 인지하게 만드는것이 개발자에 의해 미리 조작되면 안된다.

- 모델이 학습과 back propagation을 거쳐 이것들을 인지해 내도록 해야함.

- 이렇게 위에 제시된 모델이 학습에 있어 이전의 모델들보다 그 분별력이 훨씬 뛰어나다.




- 이 내용을 코드로 구현하면 위와같다.

- 이전까지 작성했던 코드에 추가적으로 작업된 내용으로는 

- max pooling 레이어를 벡터로 flatten 하였고, 두개의 dense 레이어가 추가되었다.

- 맨 마지막 레이어는 softmax activation function이기 때문에 확률을 리턴한다.

- 위의 경우 데이터셋이 10가지 종류의 각기 다른 오브젝트를 갖고있었기 때문에 10개의 노드를 줬다.

- 전체 노드와 모두 연결되는 hidden layer에는 ReLU activation function을 주는것 또한 일반적이다.


- 여기에 제시된 아이디어들은 시작단계에서의 이해를 돕기위해 위와같이 진행한 것이다.

- 다양한 경험을 통해 많은 아키텍쳐를 설계해보고, 각기 다른 hyperparameter들을 조정해 가며

- 다양한 접근방식을 취할 수 있어야 한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함