dense라는 말은 보통 딥러닝에서 FC를 의미한다.

 

하지만 densenet에서의 dense는 레이어들 간에 모두 연결되어있다는 것을 의미한다,

 

1. Dense Block

저자는 dense block의  네가지 장점을 말한다.

  • vanishing-gradient 완화 : 값의 직접적 연결때문 
  • feature propagation 강화
  • feature 재사용 : concat이기 떄문에
  • parameter 수 줄임 : concat이기에 각 레이어별 채널수가 낮음

 

1) dense block은 block내의 레이어끼리 모두 연결한다. 이를 논문에서는 drirect connection이라고 하는데 총 

L * (L+1) / 2 개의 direct connection 이 존재한다.(L : 레이어의 수)

여기서 connection은 add가 아닌 concat이다.

 

2) growth rate

growth rate란 블록안에 두번째 레이어 이후 갯수

L번째 레이어의 갯수는 k0+k*(L-1) 여기서 k0는 인풋채널수이다.  즉 k에 따라 모델이 넓어지거나 좁아질 수있다.

 

 

3) 이번에도 BN ReLU, conv순으로 이어진다

4) resnet과의 차이

resnet은 add함으로써 보존해야할 정보가 바뀌어서 다음 layer에 전해주는데에 반해서

densenet은 정보를 바꾸지 않으며 concat하여 직접적으로 하위의 모든 layer에 연결시킨다

이전의 정보를 모두를 가지고 있다는 장점이 있다.

 

 

5) bottle neck

k개의 feature map이 input 될 때 1x1conv 시 4k 

 

 

6) pool

1x1으로 차원을 줄이고 2x2 avg pool stride2로 사이즈를 절반씩 줄였다. 아무래도 dense를하려면 쭉 사이즈가 같아야해서 그런 것 같다

 

2. architecture 

resnet에 비해 효율적이다.

'CV > classification' 카테고리의 다른 글

[CV] Shuffle Net  (0) 2022.05.04
[CV] ResNext  (0) 2022.05.04
[CV] Mobile Net V2  (0) 2022.05.04
[CV] Squeeze Net  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03

 

 

1. Pointwise Group Conv, Channel Shuffle

1x1 conv를 group을 나누어 병렬 처리한다. (다양한 feat)

 

depthwise로 3x3 conv한 후

 

group으로 나누었던 channel들을 섞고 다시 그룹을 나누어 pointwise group conv를 한다.

 

2. ShuffleNet Unit

b. depth wise separable conv를 pointwise시에 group으로 실시하고 사이에 activation 이 들어가지ㅇ 않는다  add하기 전에도 activation를 생략후에 (xception과 resnext의 activation이 정보량을 줄일 것이라는 것과 비슷) add한다.

 

c. short cut 에서 avgpool(overlapping 경계선정보를 잃지 않기 위해)과 stride를 2로 두어 크기를 줄인다.

 

 

3. architecture

'CV > classification' 카테고리의 다른 글

[CV] DenseNet  (0) 2022.05.05
[CV] ResNext  (0) 2022.05.04
[CV] Mobile Net V2  (0) 2022.05.04
[CV] Squeeze Net  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03

 

 

1. Group Conv, STM (Split Transform Merge)

 

resnet과 resnext의 shortcut 구조가 상이함을 볼 수 있다.

(a) channel 4개인 32개의 path 가 병렬로 실행된 후 add

(b) channel 4개인 32개의 path 가 병렬로 실행되고concatenation 한 후 1x1 conv를 수행한다.

(c) group convolution을 한다.

 

여러개의 path를 multi branch라고도한다

res net에서 나온 net이니 만큼 short cut을 가져간다

세가지가 모두 동일한 역할을 한다. 이때 path 의 개수 = cardinality 이다.

 

 

 

group conv는 그룹을 만들어서 그 안에서 conv를 수행한다고 이해하면 편하다.

병렬로 처리하면서 자연스럽게 연산량이 줄 수 있다.

 

알렉스넷에서 두개의 gpu에서 서로 다른 특징들을 학습했던 느낌으로 피처가 다양하지는 것 같다.

 

 

 

2. architecture

 

7x7로 nonlinearity를 줄이고 선이나 면같은 부분을 빠르게 학습, 메모리소모 down

 

일반 resnet에 비해 파라미터 수는 비슷한 것에 반에 성능은 좋은 것을 확인할 수 있다.

cardinality에 따라서 성능이 달라지는 것을 확인할 수 있다. 여기서 d = depth이다.

 

'CV > classification' 카테고리의 다른 글

[CV] DenseNet  (0) 2022.05.05
[CV] Shuffle Net  (0) 2022.05.04
[CV] Mobile Net V2  (0) 2022.05.04
[CV] Squeeze Net  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03

모바일 넷의 두번째 버전이다. res넷의 res block을 가져왔따.

이해하기위해서는 mobilenet v1 과 depthwise separable에 대해 필수적으로 알아야하니 

https://gwoolab.tistory.com/65

 

[CV] MobileNet

모바일환경에서도 잘 작동할 수 있도록 파라미터와 연산량을 줄이며 성능을 확보한 모델이다. 1. Depthwise Separable Convolution Xception 에서 언급했던 Depthwise Separable Convolution을 활용하여 연산량..

gwoolab.tistory.com

저번 게시물을 참고하면 좋겠다.

 

 

 

 

1. Linear Bottleneck

 

 

linear는 그냥 activation을 적용하지않았다고 생각하면 된다.

 

고차원의 데이터가 저차원으로 압축되면서 특정 정보들이 저차원의 어떤 영역으로 매핑이 되게 되는데, 이것을 manifold라 한다. 저자는 manifold에 activation을 적용하면 relu가 정보를 줄일 것이라 한다.

실제로 위의 그래프에서 볼 수 있듯 activation을 적용하지않은 것이 성능이 좋았다. 

 

relu의 문제점 dying relu 중  gradient exploding 후자의 문제점을 해결하고자  6이후로 6을 보내는

relu6 : min(6,max(0,x)) 를 활용한다. (실험을 통해 6으로 결정했다고한다.)

 

 

stride1 block

1x1conv는 역시 채널을 줄이려고 사용했고 short cut까지 적용하여 학습이 잘되도록했다.

stride2 block

사이즈를 줄이기 위해 풀링이 아닌 stride 2를 활용하였다.

 

2. Inverted Residuals

 

 

 

일반적인 res block 은

input을 1x1로 채널을 줄이고 3x3conv로 feature를 추출한뒤에 skip connect와 합치기 위해 다시 채널을 줄이는

wide(input) -> narrow(bottleneck) -> wide(input과 같은 사이즈) 형태이다

 

inverted res block 은

input을 1x1로 채널을 확장하고 3x3conv로 feature를 추출한뒤에 skip connect와 합치기 위해 다시 채널을 늘이는

narrow(expansion) -> wide(depthwise) -> narrow(projection) 형태이다. 이때 projection에서는 relu를 거치지않는다.

 

위의 t는 얼마나 expansion할것인가 하는 하이퍼파라미터이다.

 


저차원의 channel에는 필요한 정보만 압축되어서 저장되어 있다라는 가정했기 때문이다.
필요한 정보는 저차원의 channel에 있기대문에, skip connect를 사용해도 필요한 정보를 더 깊은 layer까지 잘 전달할 것이라는 것이다
물론 메모리 사용량을 줄이기 위한 부분도 있다.

 

 

3. Architecture

 

 

 

 

 

 

'CV > classification' 카테고리의 다른 글

[CV] Shuffle Net  (0) 2022.05.04
[CV] ResNext  (0) 2022.05.04
[CV] Squeeze Net  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03
[CV] Xception  (0) 2022.05.03

최초의 경량화 모델로 알렉스넷과 비슷한 성능을 보인 모델이다. 

모델의 구조와 함께 대학 논문답게 여러가지 개념을 잘 정리해준 논문이다.

 

 

1. 적은 파라미터의 이점

 

1) 효율적인 분산 훈련

- 작은 모델이 적은 서버와의 소통으로 빠른 훈련이 가능하다

 

2) 새로운 모델 배포시에 걸리는 시간이 짧다

- 테슬라의 오토파일럿이나 IOT기기 같은 기기에 업데이트를 배포시에 작은 모델일 수록 배포 및 관리가 쉽다

 

3) 작은 기기에도 모델을 담을 수 있다.

 

2. Accuracy를 유지하면서 파라미터를 줄이는 방법

 

1) 3x3을 1x1conv로 대체해라

- 1x1conv는 3x3conv보다 파라미터가 9배 적다

 

2) 3x3conv에 들어가는 인풋채널의 수를 줄여라

- 총 파라미터는 (number of input channel) * (number of filter) * (3*3)이다. 3x3conv를 줄이는 것도 중요하지만 인풋채널을 줄이는 것도 중요하다

 

3) feature맵의 크기를 줄이는 것을 뒤로 미뤄라

- feature맵의 크기는 (1) 인풋데이터의 크기 (2) 구조에서 줄이는 것 두가지 방법으로 줄일 수 있다. 방법(2)로는 conv + stride >1 or pooling 으로 줄이게 된다.

- 저자는 큰 feature map이 좋은 acc를 얻게했다고한다. 실험을 통해서도 늦은 다운샘플이 좋은 성능을 가져왔다 한다.

 

3. Fire Module

 

스퀴즈 넷은 위와 같은 fire module로 이루어진 모델이다. 

먼저 s1x1개의 1x1conv로 채널을 squeeze한뒤에 

각각 e1x1개의 1x1conv와 e3x3개의 3x3conv를 한뒤에 concat하는 구조로 이루어진다. 

 

 

4. architecture

 

전체 구조를 보면 bypass (resnet의 그것 skip connection) 을 차용하고 있는데 첫 모델은 bypass를 적용하지않는 경우 두번째 모델은 bypass를 채널이 맞는 경우만 사용한경우 세번째는 conv11으로 채널을 맞춰서 모든 구간에 bypass를 적용한 것이다

두번째 모델이 가장 좋은 성능을 보였다

 

bypass를 추가한 이유는 Fire Module내에서 repre~ bottleneck 문제가 발생하기 때문입니다. squeeze layer의 파라미터 수는 expand layer보다 작다. 이는 모델을 가볍게 해주지만 정보 손실이 발생한다. 따라서 bypass를 추가하여 정보 손실을 막은것이다.

 

추가적으로 확인할 점은 avgpool을 활용해서 파라미터를 많이 줄엿다는 점이다.

파라미터는 비슷한 성능을 내는 alex넷과 비교했을 떄 3배가량줄었다.

 

 

Deep Compression로 추가로 더 파라미터를 줄일 수 있다고 하는데 이는 추후에 언급하겠다

'CV > classification' 카테고리의 다른 글

[CV] ResNext  (0) 2022.05.04
[CV] Mobile Net V2  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03
[CV] Xception  (0) 2022.05.03
[CV] Inception V2, V3  (0) 2022.05.03

모바일환경에서도 잘 작동할 수 있도록 파라미터와 연산량을 줄이며 성능을 확보한 모델이다.

 

1. Depthwise Separable Convolution

 

Xception 에서 언급했던 Depthwise Separable Convolution을 활용하여 연산량과 파라미터를 많이 줄였다

 

일반적인 conv의 연산량은 다음과 같다

 

일반적인 conv의 연산량 Dk : 커널크기 , M : 입력채널, N : 출력채널, Df : 출력크기(피처맵크기)

하지만 depth wise conv는 cross channel 연산이 없기때문에 아래의 좌측항이고

그리고 pointwise conv는 Dk가 1이기 때문에 우측항이다 

두 항을 더하면 위와 같은 식을 보이는데 Depthwise Separable Convolution의 연산량은 위와 같다고 할 수 있다

일반적인 conv와 비를 구하면 위의 식이 나오는데 mobile net의 경우 Dk=3 이기때문에 8배에서 9배 감소된 연산량을 가질 수 있는것이다. 

 

 

2. 

 

줄어든 연산량에도 성능이 유지되지않는다면 의미가 없기 때문에 저자는 여러가지 실험을 했다고 한다.

 

xception에서는 point wise와 depthwise사이에 activation을 두지않았지만

mobilenet에서는 Bn과 activation을 같이 가져가는 것을 확인할 수 있다.

 

이런 activation은 위치와 유뮤 문제는 밝혀진게 없어 실험으로 확인하는 수 밖에 없다고한다.(이론적 근거가 없다.)

 

 

3. Architecture

풀링이 없이 stride로 feature map의 사이즈를 줄이는 것을 확인할 수 있다. (representional bottleneck을 피하기 위해)

 

resnet이후 논문임에도 불구하고 shortcut 구조(깊이가 깊어져도 학습이 잘됨)가 없다. 일단은 가볍게 하려고 그런 것 같다

 

'CV > classification' 카테고리의 다른 글

[CV] Mobile Net V2  (0) 2022.05.04
[CV] Squeeze Net  (0) 2022.05.04
[CV] Xception  (0) 2022.05.03
[CV] Inception V2, V3  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03

1. Inception 에 대한 해석

 

일반적으로 사용한는 inception은 좌측 이고 이를 일반화하면 우측 이다. (여러가지의 feature를 학습가능하다는 점이 이어진다 + 채널을 나누어 계산이 쉽다)

저자가 해석하는 inception 이 좋은 성능을 나타내는 이유는

1x1 conv는 채널간 계산(cross-channel correlation)을 실시하고 , 3x3 conv는 각 feature맵 안에서 연산(spatial correlations)을 수행하여 잘 분해해 계산했기 때문이라고 한다.

 

 

2.  xception

위에서 언급한 일반적인 버전의 inception 모듈의 1x1conv 를 하나로 합치고 3x3conv를 확장한 xception을 제안했다.

 

좌측 Depthwise Separable Convoltuion/  우측 Extreme Inception

채널 방향의 연산은 진행하지 않고, 공간 방향의 3x3 conv을 진행후에 1x1 conv를 진행하는 Depthwise Separable Convoltuion의 순서를 반대로 적용하여

 

연산량을 줄이고 파라미터의 갯수도 크게 줄일 수 있었다.

 

또한 inception v3 보다 나은 성능을 보였다.

 

3.  activation 의 위치

 

 Inception 모듈은 1x1 conv 이후에 ReLU activation을 거친다

 xception에서도  pointwise와 depthwise 사이에 activation을 추가할 수 있다.   하지만 xception 에서는 activation을 넣지않는 것이 성능이 더 높게 나왔다고 한다.

저자의 의견으로는 activation이 정보를  바꾸어 놓고 이후의 depthwise는 depth가 없이 연산하기 때문에 오히려 정보손실을 야기할 수 있다는 것이다.

 

실제로 저자의 의견이 맞는지 왜  inception은 되고 xception은 안되는지에 대해 관해서는 밝혀진게없다

 

pre-activation resnet에서 언급된 actvation의 위치에 따라서 성능이 바뀐다는 점만 기억하면 될 것같다

 

4. archi

 

pre-activation이 보이기도하고

 

역시나 GAP가 사용되었다

'CV > classification' 카테고리의 다른 글

[CV] Squeeze Net  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03
[CV] Inception V2, V3  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02

GoogLeNet이후 구글의 연구로 나온 모델이며 영화 인셉션의 이름을 따서 만든 모델이다. 

vgg net의 영향을 받아 3x3conv 더 나아가 nx1conv 1xnconv 를 이용하여 구조는 복잡하지만 성능과 연산량을 잡은 효율적인 모델이다.

 

V2와 V3는 같은 구조를 가지고 최적화 방법만 다르기떄문에 v2를 기준으로 구조를 설명하겠다.

 

** General Design Principles

논문에 일반적인 cnn구조의 법칙을 설명하는 부분이 있어 간단히 정리해보고자한다

1)   representational bottleneck을 피하기 위해서는 극단적으로 feature맵을 줄여서는 안된다

 

2) 고차원의 것은 분할하여 계산하면 쉽다.

 

3)

 

 

 

1. Factorizing Convolutions

vgg의 영향을 받아 5x5를 3x3 두개의 연속으로 대체하는 방법을 선택했다. 이방법은 파라미터의 갯수면에서 유리한 방법이다.

 

그리고 3x3을 3x1 1x3 으로 쪼개는 방법을 통해 파라미터수(9 -> 6)를 줄였다.

좀 더 일반화하면 nxn은 1xn과 nx1로 분해 할 수 있고, n이 커질수록 파라미터를 더 많이 줄일 수 있다. 

 

위의 개념으로 일반 인셉션모델 (좌측)을 더욱 발전시켰다

 

2. auxiliary classifier

googlenet 에있던 auxiliary classifier가 큰도움이 되지않는다는 것을 알고 제외

 

 

3. Efficient Grid Size Reduction

 representational bottleneck이란 cnn에서 주로 사용되는 pooling으로 인해 feature map의 size가 줄어들면서 정보량이 줄어드는 것을 의미한다.

 Figure9를 보면 사이즈를 줄이다 representational bottleneck이 발생하고  풀링을 이후에하면 연산량이 너무 많은 문제점이 있다.

 

 inception V2에서는 representational bottleneck를 막기위해 Figure10 처럼 반은 풀링 반은 stride = 2 conv representational bottleneck을 해소한다고한ㄷ.

 

4. archi

 

'CV > classification' 카테고리의 다른 글

[CV] MobileNet  (0) 2022.05.03
[CV] Xception  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02

ResNet은 처음으로 인간이 분류할떄의 5%라는 벽을 넘은 최초의 분류모델이자

후속연구에 큰 기여를 한 모델이다. 분류모델뿐만아니라 detection 과 segmentation 부분에서도 좋은 성능을 보였다고 한다.

resnet은 15년에 14년의 googlenet보다 9배깊은 레이어를 활용하여 두배에 가까운 성능을 냈다.

 

 

1. Residual learning 

 

resnet 이전에 일반적인 cnn의 구조를 이용의 학습하면 어느정도 이상 깊어진 구조는 training error가 잘 줄지 않는 학습이 잘 되지않는 문제를 가지고 있었다 이에 논문의 저자들이 제안한 방법이 

 

short cup, skip connection, identity mapping 등으로 불리는 Residual learning 이다

 

 

이전의 학습된 정보를 conv이후의 결과와 더하는 방법이다

바로 H(x)를 학습하는 것은 어려우므로 대신 F(x) = H(x)-x 를 학습한다.  H(x)는 현재 block을 거친 값이고 x는 그 전 까지의 값이니 결국 잔차(Residiual)를 가지고 학습을 했다는 것이다.

 

concat이 아님에 주의

 

Residual Mapping은 간단하지만, Overfitting, Vanishing Gradient 문제가 해결되어 레이어를 깊게 쌓을 수 있었고 자연스럽게 성능상승으로 이어졌다.

우측 resnet의 경우는 레이어가 깊어짐에도 loss가 더 낮은것을 확인 가능하다

 

2. archi

 

resnet 34

주목할만한 점

1) 풀링이 처음에만 사용되고 스트라이드를 이용하여 Feature map의 size를 줄이고 있고 (학습을 통해서 줄인다.)

점선의 short cup에서는 차원을 맞춰주기위해

 zero padding

 1x1 Filter (Stride = 2)

두 옵션을 사용한다. 

 

2) vgg넷의 영향을 받아 3x3conv를 사용한다

 

3) bn도 같이 사용한다.

 

4) GAP를 사용한다. 

 - 레이어가 깊어지면 앞선에서 특징을 잘 추출했다고 가정하여 연산량을 감소시킬수 있기에~

 

5) agumentation 사용

 

3. bottle neck

 

resnet 50 101 152 에서는 연산량을 줄이기 위해 보틀넥구조를 사용한다. 

 

4. 후속논문

 

1) 여러 숏컷구조

여러가지 숏컷기법을 사용해봣지만 오리지날이 제일 좋은 성능을 보였다.

 

 

2) pre-activation

 

 

conv 연산 이전에 activation을 거치게하는 preactivation 구조를 제안했다

-  최적화를 쉽게 한다.

 기존 ResNet은 short cut 을 거쳐서 입력값과 출력값이 더해지고, ReLU 함수를 거친다. 더해진 값이 음수이면 ReLU 함수를 거쳐서 0이 된다. 층이 깊다면 이 증상의 영향이 더 커지게 되어 더 많은 값이 0이 되어 수렴이 어려워질 것이다.

 pre-activation 구조는 더해진 값이 ReLU 함수를 거치지 않아, 음수 값도 그대로 이용하게 된다. 실제로 학습 곡선을 살펴보면 제안된 구조가 초기 학습시에 loss를 더 빠르게 감소시킵니다.

 

- 과적합방지

pre-activation은 더해진 값이 BN을 거쳐서 정규화 된 뒤에 conv에 입력된다. 따라서 overfitting을 방지한다고 저자는 추측한다.

'CV > classification' 카테고리의 다른 글

[CV] Xception  (0) 2022.05.03
[CV] Inception V2, V3  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02

 

 

1. inception module

hebb's rule를 본따 inception module을 설계한다.

더 다양한 Feature를 추출하기 위해 여러 개의 Convolution을 병렬적으로 사용 했다.

 

channel 을 줄여 계산량을 줄이기 위해서 1x1conv를 사용하였다. (bottle neck)

주목할 점은 여러 conv를 지나간이후 resnet처럼 +가 아닌 depth간의 concat연산을 한다는 점이다

 

여기서 왜  풀링은 1x1 conv를 이후에 했냐는 의문점이 생길 수 있는데 이는

풀링은 학습이 아닌 단순계산의 차원이기때문에 파라미터가 없을 뿐아니라 채널수를 조정하지 못하기때문에 1x1 conv를 이후에 시행한다.

 

또한 vgg를 알고 있다면 5x5를 왜 3x3으로 쪼개지 않았냐는 의문이 생길 수 있는데 이는

googlenet과 vggnet이 같은 대회에서 발표했기 때문이고 이것은  이후 v2에 반영된다.

 

2. architi

 

위에서 보았던 인셉션 모듈을 여러개 스태킹한 모습을 보이고 중간중간에 미리 결과를 냐는 auxiliary classifiers 를 두어 추후에 가중치를 곱한후 더하여 로스를 계산하고 다시 학습한다.

그리고 auxiliary classifiers는 학습 시에만 사용되고, Test 할 때는 제거한다 (학습을 도와주기 위한 용도로만 사용).

최종 분류기에 GAP를 사용했다는 점도 특징적이다. 이후에 FC층을 한번 사용하여 더 많은 조합을 기대했다.

'CV > classification' 카테고리의 다른 글

[CV] Inception V2, V3  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02
[CV] ZF Net 리뷰  (0) 2022.05.01

+ Recent posts