📌 Image Classification
- classification : image에 label을 달아주는 것
- localization : image 내의 객체를 모두 인식하는 것
- instance segmentation : 각각의 단일 객체까지 segmentation하여 인식하는 것
📌 AlexNet
- 2개의 CPU를 사용한다
- 5개의 convolution layer, ReLU, max pooling 사용
- 분류를 위해 fully-connected layer가 있고, softmax를 사용한다
- gpu 1에서는 주로 컬러와 상관없는 정보를 추출하기 위한 kernel 학습, gpu 2에서는 컬러와 관련된 정보를 추출하기 위한 kernel 학습
- LeNet과 차이점
- Tanh 대신 ReLU를 사용했다
- ReLU는 linear하기 때문에 속도가 빠르다
- overlapping max pooling (stride 1, kernel size 2x2 -> 일부분 겹치면서 feature map을 만든다)
- dropout
- overfitting 방지용 regularization
- local response normalization
- ReLU 사용 때문
- ReLU는 양수 방향에서는 입력 값을 그대로 output으로 준다. 그렇게 되면 conv나 pooling 시 매우 높은 하나의 픽셀 값이 주변 픽셀에 영향을 미치게 된다. 이런 부분을 방지하기 위해서 다른 activation map의 같은 위치에 있는 픽셀끼리 정규화를 진행해준다
- data augmentation
- Tanh 대신 ReLU를 사용했다
📌 ZFNet
- AlexNet과 형태는 유사하지만, visualizing 기법 도입
- AlexNet의 구조에서 hyperparameter(사용자가 설정)의 변경을 통해 성능을 개선시킬 수 있음을 보여주었다
- visualization
- 중간 layer의 값을 확인하여 학습이 잘 되고 있는지 확인하는 방법
- DeconvNet
- visualization을 위해 존재
- unpooling
- 특정 feature의 activation이 input image에서 어떻게 mapping 되는지 이해하려면, 역으로 수행하면 된다. 가장 문제가 되는 부분은 max-pooling에 대한 역을 구하는 것이다. max-poolin 단계는 주변에서 가장 강한 자극만 다음 layer로 전달하기 때문에, 역방향으로 진행할 때는 어떤 위치에 있는 신호가 가장 강한 신호인지 파악할 수 있는 방법이 없다. ZFNet에서는 switch(가장 강한 자극의 위치 정보를 갖고 있는 flag)를 사용하여 unpooling할 때 가장 강한 자극의 위치로 정확하게 찾아갈 수 있다
- Rectified Unpooled Map
- RELU의 역과정
- 양수는 그대로 나오기에 할 수 있지만, 음수에서는 output이 모두 0이기에 복원할 방법이 없다
- Deconvolution
- input은 output에 sparse matrix를 transpose한 행렬을 곱하여 수행한다
📌 Visualization 결과
- 기존 AlexNet에서 stride(4->2), filter(11x11 -> 3x3)를 변경하여 더 다양한 feature를 추출한다
- aliasing(격자 무늬가 나타나는 것=모자이크) 문제를 해결하였다
- layer가 깊어질수록 edge나 junction같은 low-level feature가 아닌 개의 형태나 일부를 파악할 수 있는 high-level feature를 추출할 수 있다
📌 VGGNet
- kernel size가 크면 이미지 사이즈 축소가 급격하게 이루어져 깊게 모델을 쌓을 수 없고, 파라미터 개수와 연산량이 많이 필요하다. 작은 kernel size를 사용하게 되면 더 많은 ReLU 함수를 사용할 수 있고, 더 많은 비선형성을 확보할 수 있다
- dense layer에 들어가기 전 data를 1차원으로 만들기 위해 flatten을 진행하고, 4096개의 node로 시작한다
📌 Global average pooling
- NIN(Network In Network)에서는 Fully-connected 대신 global average pooling을 사용한다
- 마지막에 나온 feature map의 공간별 평균(채널마다 평균)을 통해 class에 대한 신뢰도를 출력한다.
- GAP을 사용하면 dropout에 의존적이며 overfitting의 가능성이 높은 FC에 비해 구조적으로 regularizer의 역할을 하기에 전반적으로 overfitting을 방지하는 효과를 얻을 수 있다(parameter의 개수가 폭발적으로 증가하지 않기 때문에)
- 단순히 i 번째 feature map에 있는 값들의 평균을 구해서 i 번째 출력 노드로 입력하는 것이다(feature map안의 값들의 평균을 사용하기 때문에 global context 정보를 가진다)
- 기존 FC 를 사용한 분류에서는 Flatten Layer를 이용해서 입력받은 값을 굉장히 긴 하나의 벡터로 만든 다음, 그 벡터를 FC에 넣는 방식으로 하나하나 매핑해서 클래스를 분류했다. 이 과정에서 공간적 정보도 많이 잃어버리는데다가, 굉장히 많은 파라미터, 즉 가중치가 많이 필요하고, VGGNet의 경우 이 부분이 전체 계산량의 85%를 차지한다는 단점이 있다.
📌 GoogLeNet
- Inception Module
- Auxiliary Classifier
- 네트워크의 깊이가 깊어질수록 vanishing gradient problem 문제를 파악하기 어려워진다. 가중치를 훈련하는 과정에서 역전파를 주로 활용하는데, 역전파 과정에서 가중치를 업데이트하는데 사용되는 gradient가 점점 작아져서 0이 되어버리는 것이다. ㄷ이에 네트워크 내의 가중치들이 제대로 훈련되지 않는다. 이 문제를 극복하기 위해서 GoogLeNet에서는 네트워크 중간에 2개의 보조 분류기를 달아주었다
- depth가 너무 깊어서, 중간에 나온 결과들을 역전파를 통해 training할 수 있도록 classifier를 만들었다
- training에만 사용하고, test 시에는 제거해준다
'학교 공부 > 컴퓨터비전' 카테고리의 다른 글
20. Convolutional Neural Network #2 (0) | 2022.12.13 |
---|---|
19. Convolutional Neural Network (0) | 2022.12.13 |
18. Learning Techniques for Neural Networks (0) | 2022.12.13 |
16(3). Image Retrieval (0) | 2022.12.10 |
16(2). Object Detection(Image Retrieval) (0) | 2022.12.10 |