반응형
글의 가독성을 위해 아래 링크에 정리해둠.

https://blog.naver.com/younjung1996/223413266165

 

[딥러닝] Depth-wise Separable Convolution

Depth-wise Separable Convolution은 합성곱 신경망(CNN:Convolution Neural Network)의 효율성과...

blog.naver.com

안녕하세요. 

 

Google Coral에서 학습된 모델을 통해 추론을 할 수 있는 Coral Board & USB Accelator 가 있습니다. 

 

저는 Coral Board를 사용하지 않고, 라즈베리파이4에 USB Accelator를 연결하여 사용할 생각입니다. 

 

딥러닝을 위해 나온 제품이라 할지라도 아직 부족한 부분이 많습니다.

 

이런 고성능 환경이 아닌 곳에서도 학습하고, 추론할 수 있는 모바일 넷(Mobile Net)이 개발되었습니다. 

 

그 중 Mobile Net의 Architecture에서 Depthwise Separable Convolution에 대해 이야기하겠습니다. 

 

Depthwise separable Convoltion은 Parameter를 줄임으로, 연산량을 줄이고, 속도를 높이는 기법입니다. 

 

 

 

 

 

https://hichoe95.tistory.com/48

 

Different types of Convolutions (Grouped convolution, depthwise convolution, pointwise convolution, depthwise separable convolut

오늘 정리해 볼 것들은 앞으로 정리할 논문들을 위해 미리 알아두면 좋은 convolution입니다. 각 convolution들에 대한 간단한 특징과 param수, 연산량 등에대해서 알아봅시다 ㅎㅎ 들어가기에 앞서 몇��

hichoe95.tistory.com

 

Depthwise Separable Convolution = Depthwise Convolution + Pointwise Convolution

 

아마 Depthwise Separable Convolution을 공부하실 때 위 그림을 가장 많이 보셨을겁니다.

 

 

 

Depthwise Convolution으로 채널간 Spartial Correlations을 고려하여 ~ 각각 독립적으로 패턴을 파악하고 ~ 

Pointwise Convolution으로 Cross Channel Correlations로 채널을 조절할 수 있는 ~ 블라블라

 

위 블로그 분께서 굉장히 정리를 잘해주셨습니다.

 

그럼 저의 글의 목적은 무엇이냐.

 

Standard Convolution과 Depthwise Separable Covolution를 pytorch로 구현하여 정말로 파라미터 수와 연산량이 줄어드는지 결과값을 눈으로 확인하는 것입니다.

 

 

1. Standard Convolution

Convolution = K * K * C * M

 

k : Kernel ( 3으로 가정)

c : intput_dimension (channel ) (100으로 가정)

m : output_dimension (activation map) (1000으로 가정)

 

standard_convolution = nn.Conv2d(in_channels=100, out_channels=1000, kernel_size=3, bias=False)
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 1000, 15, 15]         900,000
================================================================
Total params: 900,000
Trainable params: 900,000
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 1.72
Params size (MB): 3.43
Estimated Total Size (MB): 5.26
----------------------------------------------------------------

 

 

2. Depth-wise Convolution

Depthwise Convolutuon = K * K * C

 

k : Kernel ( 3으로 가정)

c : intput_dimension (channel ) (100으로 가정)

m : output_dimension (activation map) (1000으로 가정)

 

depthwise_convolution = nn.Conv2d(in_channels=100, out_channels=1000, kernel_size=3, groups=100,bias=False)
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1          [-1, 100, 15, 15]             900
================================================================
Total params: 900
Trainable params: 900
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 0.17
Params size (MB): 0.00
Estimated Total Size (MB): 0.29
----------------------------------------------------------------

 

 

3. Point-wise Convolution ( 1 x 1 Convolution )

Pointwise Convolutuon = C * M

 

k : Kernel ( 3으로 가정)

c : intput_dimension (channel ) (100으로 가정)

m : output_dimension (activation map) (1000으로 가정)

 

pointwise_convolution = nn.Conv2d(in_channels=100, out_channels=1000, kernel_size=1, bias=False)
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 1000, 17, 17]         100,000
================================================================
Total params: 100,000
Trainable params: 100,000
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 2.20
Params size (MB): 0.38
Estimated Total Size (MB): 2.70
----------------------------------------------------------------

 

 

4. Depthwise Separable Convolution 

Depthwise Separable Convolution = K * K * C + C * M = C( K * K + M )

 

k : Kernel ( 3으로 가정)

c : intput_dimension (channel ) (100으로 가정)

m : output_dimension (activation map) (1000으로 가정)

 

depthwise_separable_convolution = nn.Sequential(
    nn.Conv2d(in_channels=100,
              out_channels=100,
              kernel_size=3,
              groups=100,
              bias=False),

    nn.Conv2d(in_channels=100,
              out_channels=1000,
              kernel_size=1,
              bias=False)
)
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1          [-1, 100, 15, 15]             900
            Conv2d-2         [-1, 1000, 15, 15]         100,000
================================================================
Total params: 100,900
Trainable params: 100,900
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 1.89
Params size (MB): 0.38
Estimated Total Size (MB): 2.38
----------------------------------------------------------------

Depthwise Separable Convolution = Depthwise Convolution + Pointwise Convolution ( 100900 = 100000 + 900 ) 

 

Standard Convolution Parameters = 900,000

Depthwise Separable Convolution Parameters = 100,900

 

=> 약 K(Kernel Size) 제곱의 차이

 

5. Kernel Size가 값이 굉장히 크다면... ( kerenl size == 7 )

 

Standard Convolution 

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 1000, 11, 11]       4,900,000
================================================================
Total params: 4,900,000
Trainable params: 4,900,000
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 0.92
Params size (MB): 18.69
Estimated Total Size (MB): 19.73
----------------------------------------------------------------

 

Depthwise separable Convolution 

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1          [-1, 100, 11, 11]           4,900
            Conv2d-2         [-1, 1000, 11, 11]         100,000
================================================================
Total params: 104,900
Trainable params: 104,900
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 1.02
Params size (MB): 0.40
Estimated Total Size (MB): 1.53
----------------------------------------------------------------

 

Kernel의 사이즈가 커질수록, 엄청난 파라미터 수의 감소를 보여주며, 곱셈을 덧셈으로 대체하기 때문에 연산이 굉장히 빨라집니다.

 

이러한 특징덕에 의해, Depthwise separable Convolution를 통한 Inception, Xception, mobile net 등 여러 논문에서 많이 등장합니다. 

 

728x90
반응형
반응형

안녕하세요.

 

오늘은 처음으로 라즈베리파이 GPIO에 무언가를 연결해서 실습해봅니다. 

 

아두이노, AVR, 라즈베리파든 어떤 것이 되었든 처음은 LED로 시작해야겠지요??

 

우선 LED부터 준비하겠습니다. 

 

일단 집에 굴러다니는 LED 하나 씩 주워옵니다. 

 

무슨 색인지, 전압이 어떻게 되는지 아무도 모릅니다. 

 

혹시 집에 측정기를 가지고 계시나요? 

 

LED는 발광 다이오드로 순방향 전압을 가했을 때 발광하는 역할을 합니다.

 

한마디로 그냥 PN다이오드이고 순방향 전압이 흘렸을 때 빛이 난다는 것입니다. 

 

light emitting diode

led는 다이오드이기 때문에 측정기를 다이오드에 두고 측정해보겠습니다. 

 

다이오드 버튼에 갖다두고

 

(+) : 긴다리 ; 빨간색 봉  => GPIO 선 (저 같은 경우는 2번에 연결함)

(-) : 짧은 다리 : 검은색 봉=> GND(접지) 

 

위 측정한 값을 통해 알 수 있는 것

1. blue led

2. led에 필요한 순방향으로 약 2.6V가 걸리면서 led가 켜진다. 

 

GPIO 2번 : 빨간색 봉

접지(GND) : 검은색 봉

 

현재 GPIO를 2초마다 HIGH LOW로 반전되는 상황 

 

3.3V -> 0V -> 3.3V -> 0V ->3.3V ....

 

약 3.3V 

위 측정한 값을 통해 알 수 있는 것

1. GPIO가 HIGH일 때 3.3V

2. GPIO가 LOW일 때 0V

 

(입력 전압 - LED 전압) / LED 전류 = 저항값

 

입력전압 : 약 3.3V

LED 전압 : 약 2.6V

LED 전류 : 약 20mA(기본적으로 LED의 전류는 20~30mA라고 한다.)

 

(3.3 - 2.6) / 0.02 = 35(ohm)

 

위 LED에 필요한 저항은 35이라는 것을 알 수 있다.

 

 

하지만 현재 가지고 있는 가장 작은 저항이 100옴이니, 그냥 100옴을 쓰겠습니다. 하하...

대략, 이런 느낌일까요... 피스파이스로 그리는걸 예전에 배웠는데 현재는 다 까먹었습니다.. 못그렸지만 잘봐주시길..

 

빵판에 꼽으면 이렇게 됩니다. 코드는 최대한 아두이노 느낌으로 한 번 가보겠습니다. 

 

import RPi.GPIO as GPIO
import time


def setup():
   GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme 
   GPIO.setup(2, GPIO.OUT) # output rf


def loop():
   GPIO.output(2, GPIO.HIGH)
   time.sleep(0.1)      
   GPIO.output(2, GPIO.LOW)
   time.sleep(0.1)


try:
   setup()
   
   while(True):
      loop()        
         
except KeyboardInterrupt: 
   print("Keyboard interrupt")

except:
   print("some error") 

finally:
   print("clean up") 
   GPIO.cleanup() # cleanup all GPIO 

 

아두이노처럼 setup 부분 loop 부분으로 함수화 시켰습니다. 

 

KeyboardInterrupt는 CTRL C 를 치면 인터럽트 걸립니다. 

 

finally로 동작을 마치면 GPIO 핀을 clean 시킵니다. 

 

동작은 0.1초씩 점멸할 것입니다. 

 

 

 

 

 

728x90
반응형

+ Recent posts