Inception

  • 1*1 convolution
  • Inception Network의 motivation
  • Inception Network

 


Inception

  • googLeNet에서 사용되었다

 

1. 1×1 convolution

  • 비선형성 부여
  • feature map의 channel을 줄이는 역할

 

Coursera - Andrew Ng

 

  • 1*1 convolution layer의 다른 이름은 network in network
  • 6*6*32 feature map에 1*1*32 필터 K개를 통과시키면 -> 6*6*K feature map을 얻는다.
  • 이것은 channel별로 fully connected layer 통과하는 것과 동일하다! (input node 32, output node는 필터의 개수인 FC)
  • 1*1 convolution layer는 feature map의 channel 수를 줄이기 위해 사용된다.

 

Coursera - Andrew Ng

  • feature map의 width와 height를 줄이려면? pooling layer 통과!
  • feature map의 channel을 줄이려면? 1*1 conv layer 통과! + 이 때 비선형성도 부여해줄 수 있다

 


2. Inception Network의 motivation

 


  • 여러 사이즈의 필터 정보를 활용하여 하나의 feature map을 구성하고 싶다!
  • 하지만 계산비용이 어마어마하다 (학습해야 하는 파라미터의 수가 매우 많다)
  • 일례로 5*5 conv layer의 파라미터 수를 아래에서 알아보자.

 

 

Coursera - Andrew Ng

  • 28*28*192 feature map에 5*5 conv layer 통과한 뒤 28*28*32 feature map을 만드려면 필요한 파라미터는?
  • (5*5*192+1)*32 = 153,632 (bias 포함)
  • 너무 많은 parameter가 학습되어야 한다 🙁
  • -> 1*1 convolution layer를 사용해서 파라미터의 수를 줄여보자

 

Coursera - Andrew Ng

  • (1) 28*28*192 feature map의 channel 수를 1*1 conv layer 사용해 28*28*16으로 변경
    • 여기서의 parameter 수 = (1*1*192+1)*16 = 3,088
  • (2) 28*28*16 feature map에 5*5 conv layer 통과한 뒤 28*28*32 feature map 얻는다.
    • 여기서의 parameter 수 = (5*5*16+1)*32 = 12,832
  • (1)+(2) 전체 parameter의 수 = 15,920 << 153,632 (약 1/10 수준)

 

 

  • 여기서 중요한 것은 우리의 목적은 5*5 conv layer를 통과시키는 것이다.
    하지만 그냥 통과시키기에는 파라미터의 개수가 너무 많다 🙁
  • 따라서 1*1 conv layer 통과시켜 channel을 줄인 뒤 3*3 conv layer 통과시키자!
    그러면 학습해야 하는 parameter의 수 줄어든다. 🙂
  • 이렇게 1*1 conv layer 통과시켜 channel 줄인 뒤 filter 적용하는 구조를 bottle neck 구조라고 한다

bottleneck

 


3. Inception Network

https://static.googleusercontent.com/media/research.google.com/ko//pubs/archive/43022.pdf

 

  • inception module에서 다양한 feature를 추출하기 위해 1*1, 3*3, 5*5, pooling을 각각 수행한다.
  • 하지만 이렇게 naive하게 feature map을 concatenate하게 되면 연산량이 급격히 증가하는 문제가 있다.
  • 이것을 해결한 것이 아래의 inception module이다.

 

 

 

https://static.googleusercontent.com/media/research.google.com/ko//pubs/archive/43022.pdf

 

  • 3*3, 5*5 conv layer 통과하기 전, 1*1 conv layer통과하여 channel의 수를 줄여주어 연산량을 줄일 수 있다.
  • pooling layer를 통과한 뒤 1*1 conv layer 통과하여 channel의 수를 줄여주어 다음 layer의 연산량을 줄여주었다.
  • 이처럼 1*1 conv layer를 활용하여 연산량을 줄여주었다는 것이 핵심 아이디어이다.

 

 

 

 

https://static.googleusercontent.com/media/research.google.com/ko//pubs/archive/43022.pdf

 

  • 이러한 inception module을 활용한 googLeNet의 전체적인 구조는 위와 같다.
  • 여기서 주목해야 할 부분은 3가지가 있다.
    • 1. 중간중간 inception module을 사용해주었다는 것 

    • 2. 네트워크의 얕은 부분에는 inception module을 적용해주지 않았다는 것
      • 논문에 따르면 입력과 가까운 부분에서는 inception의 효과가 없었다고 한다.

    • 3. auxiliary classifier를 사용해주었다는 것
      • 목적
        • 앞에 위치한 layer까지 gradient가 잘 전달되지 않고 소멸되는 vanishing gradient 문제를 해결하기 위해
        • 학습을 잘하도록 도와주는 보조 역할 수행
      • 방법
        • 중간중간 softmax를 통해 결과를 뽑아 loss를 구해주고, gradient를 전파해준다.
      • 주의할 점
        • auxiliary classifier에서 구한 loss가 weight matrix update에 너무 큰 영향을 주는 것을 막기 위해
          여기서 구해진 loss에는 0.3을 곱해준다.
        • 학습할때만 auxiliary classifier를 사용하고, test time에서는 사용하지 않는다.

 

 

'🙂 > Coursera_DL' 카테고리의 다른 글

WEEK6 : Object Detection (1)  (0) 2020.12.23
WEEK6 : convNet 사용에 도움이 될 지식  (0) 2020.12.23
WEEK6 : ResNet  (0) 2020.12.23
WEEK5 : CNN (convolutional neural network)  (0) 2020.12.21
WEEK5 : end to end DL  (0) 2020.12.21

+ Recent posts