코딩하는 해맑은 거북이

딥러닝 기초 다지기 (3) 본문

AI

딥러닝 기초 다지기 (3)

#CJE 2022. 12. 25.
본 게시물의 내용은 '딥러닝 기초 다지기(부스트코스)' 강의를 듣고 작성하였다.
해당 글은 3. Convolutional Neural Networks (CNN) 3가지 파트를 다룬다.
1. CNN - Convolution은 무엇인가?
2. Modern CNN - 1x1 convolution의 중요성
3. Computer Vision Applications

 

1. CNN - Convolution은 무엇인가?

- Convolution

I : 전체이미지, K : 적용하고자 하는 필터

 

하나의 output 값은 적용하고자 하는 필터를 이미지의 적절한 위치에 도장을 찍는다고 생각하면 된다!

값을 위치에 맞는 것끼리 곱한 최종 합 + bias가 output으로 나오게 된다.

2D convolution 연산은 적용하고자 하는 필터 모양에 따라 같은 이미지에 대해서 Blur, Emboss, Outline 등 영상처리 기법이 적용된다.

 

- RGB Image Convolution

RGB Image는 3개의 채널을 가지므로 filter도 3개의 채널을 가지는 것으로 convolution을 수행하였다.

필터를 여러개를 적용하면 output 역시 필터 갯수에 맞게 여러개가 된다.

Q. 각 연산에 필요한 파라미터 갯수는?

1) 1번째 convolution 연산

32x32x3 -> 28x28x4 = 5x5x3x4

>> (conv filter = 커널의 사이즈) x input의 채널 x output의 채널

>> (5x5)x3x4

 

2) 2번째 convolution 연산

28x28x4 -> 24x24x10 = 5x5x4x10

 

- Convolutional Neural Networks

일반적인 CNN은 convolution layer, pooling layer, fully connected layer 로 구성된다.

convolution layer, pooling layer : feature extraction (특징추출)

fully connected layer : decision making (분류나 회귀를 해서 원하는 추출값을 얻어내는 것)

 

* 요즘은 fully connected layer 를 없애거나 최소화 시키는 추세이다.

이유는 파라미터 숫자에 의존하겠다는 것.

학습해야하는 파라미터 숫자가 늘어날수록 학습이 어렵고, 학습에서 얻어진 결과가 한번도 보지못한 테스트 데이터에서 얼마나 잘동작하는지에 대한 성능이 떨어진다.

그래서, CNN은 같은 모델을 만들고, 최대한 모델을 깊게 convolution layer를 많이 만들고, 동시에 파라미터 갯수를 줄이는데 집중하게 된다.

 

cf) GoogLeNet 

파라미터의 갯수를 직접 계산해서 따라가보자~

 

- Stride & Padding

Stride : 넓게 걷는다, 몇칸씩 띄어서 이동할지를 의미

Padding : 이미지의 가장자리를 덧대주는것을 의미

Stride (1), Padding (0) / Stride (1), Padding (1)
Stride (2), Padding (0) / Stride (2), Padding (1)

Q. CNN Feature map의 output 크기는?

 

 

- Convolution Arithmetic

 

cf) AlexNet

* x 2 를 해주는 이유 : 당시 사용하던 GPU가 크지 않아서 네트워크를 나눠주었음.

# convolution layer

1) 11 X 11 X 3 X 48 * 2 35k

2) 5 X 5 X 48 X 128 * 2 307k

3) 3 X 3 X 128 * 2 X 192 * 2 884k

4) 3 X 3 X 192 X 192 * 2 663k

5) 3 X 3 X 192 X 128 * 2 442k

 

# dense layer = fully connected layer 

(input의 파라미터 갯수 x output의 뉴런의 갯수)

6) 13 * 13 * 128 * 2 X 2048 * 2 177M

7) 2048 X 2 X 2048 * 2 16M

8) 2048 X 2 X 1000 4M

 

* dense layer로 오면서 파라미터 갯수가 급격하게 늘어났다!

convolution operator가 각각의 하나의 커널이 모든 위치에 대해서 동일하게 적용되기 때문이다.

그래서 convolution operator는 일종의 shared parameter이다.

네트워크 성능을 향상시키기 위해서는 파라미터갯수를 줄이는게 중요한데 대부분의 파라미터가 fully connected layer에 들어가 있으므로 fully connected layer를 줄이고, convolution layer를 깊게 쌓게 일반적인 트렌드이다.

 

- 1x1 Convolution

이미지에서 한 픽셀만 보고, 채널방향으로 줄이는 것.

* 왜 사용할까? Dimension reduction (차원축소)

>> convolution layer를 깊게 쌓으면서 동시에 파라미터 갯수를 줄일 수 있음.

(대표적인것으로 bottleneck architecture가 있음)

 

 

 


2. Modern CNN - 1x1 convolution의 중요성

- ILSVRC = ImageNet Large-Scale Visual Recognition Challenge

  • Classification / Detection / Localization / Segmentation
  • 1,000 different categories
  • Over 1 million images
  • Training set: 456,567 images
  • 사람의 Error Rate : 약 5.1%, 2015년 Error Rate : 3.5%로 사람보다 성능이 좋아짐.

 

 

- AlexNet (2012) : 최초로 Deep Learning을 이용하여 ILSVRC에서 수상.

* 특징

  • 네트워크가 2개로 나누어져 있음 → 당시 GPU 부족으로 2개의 GPU에 따로 train 시키는 전략
  • input이 11x11x3을 사용한다. → 11x11 필터는 하나의 convolution kernel이 볼 수 있는 이미지 레벨에서의 영역은 커지지만 상대적으로 더 많은 파라미터가 필요하게 된다.
  • 5개의  convolutional layers와 3개의 dense layers로 이루어져 있다. → 총 8개의 layer로 되어 있는 뉴럴네트워크이다.

 

* key ideas

  • Rectified Linear Unit (ReLU) activation
  • GPU implementation (2 GPUs)
  • Local response normalization, Overlapping pooling
  • Data augmentation
  • Dropout

→ 지금 봤을때는 당연한 것들이다. 당시에는 딥러닝을 활용한 논문들이 없었어서 당연하지 않았음.

 

cf) ReLU Activation

  • Preserves properties of linear models - 선형모델의 좋은 성질들을 가지고 있다.
  • Easy to optimize with gradient descent - 학습이 용이
  • Good generalization
  • Overcome the vanishing gradient problem - 기울기 소실 문제를 극복한다.

 

 

- VGGNet (2014) : 3x3 Convolution을 이용하여 Receptive field는 유지하면서 더 깊은 네트워크를 구성.

* 특징

  • Increasing depth with 3x3 convolution filters (with stride 1)
  • 1x1 convolution for fully connected layers - 차원 축소(Dimension Reduction)의 효과
  • Dropout (p=0.5)
  • VGG16, VGG19 - 총 각각 16 layers, 19 layers 사용

 

Q. 왜 3x3 convolution을 사용했을까?

convolution filter의 크기가 커지면 커질수록 고려되는 input의 크기(Receptive field)가 커진다.  

- 3x3 filter를 2개 사용하는 것 = 5x5 filter를 1개 사용하는 것.

그러나, 파라미터의 갯수는 1.5배정도 차이가 난다.

9(3x3) + 9(3x3) = 18 < 25(5x5) 이므로 같은 Receptive field를 얻는 관점에서 5x5 filter 1개 사용하는 것보다 3x3 filter를 2개 사용하는게 파라미터 수를 줄일 수 있다.

 

 

- GoogLeNet (2014) : Inception blocks 을 제안.

* 특징

  • 총 22개의 layer로 구성된다.
  • 비슷하게 보이는 네트워크(검은색박스)가 여러번 반복된다. → network-in-network (NiN) with inception blocks. 

 

* Inception blocks

하나의 입력이 들어왔을 때, 여러개로 펼쳐졌다가 하나로 합쳐지게 된다. 여기서 각각의 path를 보게되면

3x3 convolution filter나 5x5 convolution filter를 하기 전에 1x1 convolution이 들어간다.

하나의 입력에 대해 여러개의 Receptive field를 갖는 필터를 거치고 이걸 통해서 여러개의 response들을 concat하는 효과도 있지만, 1x1 convolution을 끼어들게 함으로써 전체적인 네트워크의 파라미터 수를 줄이게 된다.

 

Q. 왜 1x1 convolution은 파라미터 수를 줄일까?

1x1 convolution은 채널방향으로 dimension을 줄일 수 있는 효과가 있다.

3x3 convolution을 1개 사용한 것 보다 중간에 1x1 convolution을 통해서 128 채널을 32로 줄인 것에 3x3 convolution을 하는 것이 파라미터 수가 3배 가까이 줄어든다.

입력과 출력의 Receptive field와 채널이 128로 동일한 것은 똑같다!

 

Q. CNN 아키텍처인 AlexNet, VGGNet, GoogLeNet 중 파라미터 수가 가장 작은 것은?

1. AlexNet (8-layers) : 60M
2. VGGNet (19-layers) : 110M
3. GoogLeNet (22-layers) : 4M

→ 네트워크는 AlexNet보다 3배정도 깊어졌지만, 파라미터 수는 10배 이상 줄었다. 

이유 : 1) dense layer ↓   2) 11x11 파라미터 ↓   3) 1x1 convolution - feature dimension ↓

 

 

- ResNet (2015) : Residual connection(Skip connection)이라는 구조를 제안. h(x) = f(x) + x 의 구조

* 네트워크가 커짐에 따라 발생하는 문제

1) Overfitting : train error가 줄어드는데 test error가 커지는 것.

2) Generalization Performance : train error가 줄어듦에도 불구하고 test error가 train error와 차이가 많이 나는 것. 즉, 학습이 안되는 것

Generalization Performance

Generalization Performance를 해결하기 위해서 Residual connection (identity map)을 추가한다.

* skip connection : 입력 x를 뉴럴네트워크의 출력값 or 1개의 convolution layer에 더해주는 것 → residual(잔차)만 학습

 

ResNet 구조는 이를 이용해서 더 깊은 네트워크를 학습시킬 수 있다.

 

보통 Simple Shortcut을 활용하지만, 차원이 다른 경우 1x1 Conv으로 채널을 바꿔주는 것이 Projected Shortcut 이다.

또 위의 그림을 통해 알아볼 수 있는 것은 Batch Norm이 3x3 Conv 다음에 일어난다.

 

* Bottleneck architecture

GoogLeNet의 inception blocks와 똑같음.

3x3 Conv을 하기전에 1x1 Conv로 input 채널을 줄이고, 3x3 Conv을 한 다음에 1x1 Conv로 input 채널을 늘리는 용도로 사용한다. 궁극적으로 원하는 input 채널과 output 채널을 맞출 수 있는 것이다.

 

cf) 지금까지의 CNN 아키텍처 흐름의 결론

: performance는 증가하고, parameter size는 감소한다. 

 

 

- DenseNet : Resnet과 비슷한 아이디어지만 Addition이 아닌 Concatenation을 적용한 CNN.

ResNet에서 '+' 했던 것을 'concatenation' 하는 것!

문제는 concatenation를 하면 채널이 기하급수적으로 커진다. 

채널이 커지면 파라미터 수가 같이 기하급수적으로 커진다.

그래서 중간에 한번씩 채널을 줄여줘야 한다. → 1x1 Convolution

 

* Dense Block → 채널을 기하급수적으로 키운다

  • Each layer concatenates the feature maps of all preceding layers.
  • The number of channels increases geometrically.

* Transition Block → 채널을 줄인다.

  • BatchNorm -> 1x1 Conv -> 2x2 AvgPooling
  • Dimension reduction

 

 

- Summary

  • VGG: repeated 3x3 blocks → Receptive field를 늘리려면 3x3
  • GoogLeNet: 1x1 convolution → 파라미터 수를 줄임
  • ResNet: skip-connection → 네트워크를 깊게 쌓을 수 있게 함
  • DenseNet: concatenation → 네트워크를 더하는 것 대신 쌓으면서 더 좋은 성능을 냄

 

 

 

3. Computer Vision Applications

- Semantic Segmentation

어떤 이미지를 픽셀마다 분류하는 것.

dense classification, per-pixel classification 라고도 불린다.

자율주행, 운전보조장치로 많이 활용된다.

 

cf) 일반적인 CNN 구조

CNN

 

* Fully Convolutional Network

일반적인 CNN 구조에서 dense layer를 없애는 것. 

dense layer를 없애는 과정을 Convolutionalization 라고 한다.

Fully Convolutional Network

 

Q. 파라미터의 수는 달라질까?  NO! 동일하다

4x4x16x10 = 2,560 으로 왼쪽과 오른쪽 모두 동일하다.

 

Q. 그럼 파라미터의 수가 동일한데 Fully Convolutional Network를 왜 사용할까?

1) Transforming fully connected layers into convolution layers enables a classification net to output a heat map.

→ input의 spatial dimension에 independent 하다. 즉, 어떠한 input 이미지에 상관없이 돌아간다. 그리고 output이 커지게 되면 이에 비례해서 뒤의 layer가 커지게 된다. 이러한 동작이 마치 heat map과 같은 효과가 있다.

 

While FCN can run with inputs of any size, the output dimensions are typically reduced by subsampling. 
So we need a way to connect the coarse output to the dense pixels. 

→ FCN은 어떠한 크기의 input에 돌아가긴 하지만, output dimension은 줄어들긴 한다. 그래서 coarse output를 원래의 dense pixels로 늘리는 역할이 필요하다.

 

 

* Deconvolution (conv transpose)

convolution의 역연산으로 spatial dimension을 키워주게 된다.

하지만 엄밀하게 말하면 convolution의 역연산이라는 것은 존재할 수 없다. 즉, 복원하는 것은 불가능하다.

즉, Deconvolution도 엄밀히 말하면 convolution의 역은 아니다. 

 

https://github.com/vdumoulin/conv_arithmetic
Convolution(No padding, strides)   /   Deconvolution(No padding, strides, transposed)

 

 

- Detection

이미지 안에서 물체를 Bounding-Box로 찾아내는 것.

 

* R-CNN : https://arxiv.org/pdf/1311.2524

: detection을 할 수 있는 가장 간단한 방법이다. 그러나 정확하지 않다.

(1) takes an input image

(2) extracts around 2,000 region proposals (using Selective search)

(3) compute features for each proposal (using AlexNet), and then 

(4) classifies with linear SVMs.

 

 

* SPPNet : https://arxiv.org/abs/1406.4729

R-CNN의 가장 큰 문제는 이미지 안에서 Bounding-Box를 2000개 뽑으면, 2000개의 이미지 or fetch를 CNN에 다 통과시켜야 한다. 즉, CNN을 2000번을 돌려야 1개의 이미지를 돌릴 수 있다. (59s/image on CPU - 1개의 이미지당 약 1분이 걸림)

그래서 이미지 안에서 CNN을 1번만 돌리는것이 SPPNet이다.

\이미지 안에서 Bounding-Box를 뽑고, 이미지 전체에 대해서 Convolutional Feature Map을 만든 다음에 뽑힌 Bounding-Box의 위치에 해당하는 Convolutional Feature Map의 tensor만 가져오는 방법이다. 그래서 R-CNN보다 훨씬 빠르게 동작한다.

 

 

* Fast R-CNN : https://arxiv.org/abs/1504.08083

SPPNet도 결국에는 tensor를 여러개 가져와서 spatial pyramid pooling으로 하나의 벡터로 만들고 분류를 해줘야하므로 느리다. SPPNet과 비슷한데 뒷단에 nerual network를 통해서 bounding-box regressor과 classification을 했다는 것이 큰 의미를 가진다.

(1) Takes an input and a set of bounding boxes. 
(2) Generated convolutional feature map
(3) For each region, get a fixed length feature from ROI pooling
(4) Two outputs: (nerual network를 통해서) class and bounding-box regressor. 

 

 

* Faster R-CNN : Region Proposal Network + Fast R-CNN : https://arxiv.org/abs/1506.01497

이미지에서 Bounding-Box를 뽑아내는 Region Proposal Network(RPN)도 학습을 하자고 제안한 것!

RPN은 이미지에서 특정 영역이 Bounding-Box로써의 의미가 있을지 찾아주는 것이다.

이를 위해서 미리 정해놓은 Bounding-Box의 크기인 anchor box가 필요하다.

즉, 이미지에 어떤 크기의 물체들이 있을 것 같다고 미리 알고 있는 것이다.

k개의 anchor boxes (=템플릿)를 만들어 놓고, 이것들이 얼마나 바뀔지에 대한 offset을 찾고 궁극적으로는 해당 템플릿을 고정해두는 것이 특징이다.

 

3x3 필터가 지나갈때 bounding-box를 미리 지정해놓은 anchor의 각각의 anchor box에 따라 classification(맞는지 아닌지를)을 한다. k개의 bounding-box를 regression하려면 4K개의 좌표가 필요하다.

RPN

RPN은 anchor에 저장된 bounding-box를 뽑아내야 하므로, input에 따라 영향을 받지 않는 Fully-Connected Network의 사용이 있을 수 밖에 없다.

 

  • 9: Three different region sizes (128, 256, 512) with three different ratios (1:1, 1:2, 2:1)
  • 4: four bounding box regression parameters
  • 2: box classification (whether to use it or not)

 

* YOLO (You Only Look Once) : https://arxiv.org/abs/1506.02640

Bounding-Box를 찾아내는 것과 class를 찾아내는 것을 같이 하기 때문에 Faster R-CNN보다 훨씬 빠르다.

  • Given an image, YOLO divides it into SxS grid. 
    If the center of an object falls into the grid cell, that grid cell is responsible for detection.
  • Each cell predicts B bounding boxes (B=5). 
    • Each bounding box predicts
      • box refinement (x / y / w / h)
      • confidence (of objectness)
  •  Each cell predicts C class probabilities. 
  • In total, it becomes a tensor with SxSx(B*5+C) size. 
    • SxS: Number of cells of the grid
    • B*5: B bounding boxes with offsets (x,y,w,h) and confidence
    • C: Number of classes

'AI' 카테고리의 다른 글

[딥러닝] CNN (Convolutional Neural Network)  (0) 2022.12.31
딥러닝 기초 다지기 (4)  (0) 2022.12.26
딥러닝 기초 다지기 (2)  (0) 2022.12.25
딥러닝 기초 다지기 (1)  (0) 2022.12.25
인공지능(AI) 기초 다지기 (8)  (0) 2022.12.23
Comments