๊ธ€์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์•„๋ž˜ ๋งํฌ์— ๋‹ค์‹œ ์ •๋ฆฌํ•จ.

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

 

[๋”ฅ๋Ÿฌ๋‹] Depth-wise Separable Convolution

Depth-wise Separable Convolution์€ ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(CNN:Convolution Neural Network)์˜ ํšจ์œจ์„ฑ๊ณผ...

blog.naver.com

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ CNN์—์„œ Depth-wise Separable Convolution์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

Depth-wise Separable Convolution

Depth-wise separable Convolution์„ ๊ฐ€์žฅ ์ž˜ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ CNN์— ๋Œ€ํ•ด ์ž์„ธํ•œ ์ดํ•ด๊ฐ€ ์—†์œผ๋ฉด ์ด ๊ทธ๋ฆผ์„ ๋ณด๋”๋ผ๋„ ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

์œ„ ๊ทธ๋ฆผ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Standard(์ผ๋ฐ˜) Convolution์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

Standard Convolution ์—ฐ์‚ฐ ๊ณผ์ •

์œ„ gif๋Š” ์ œ PPT ๋‚ด์šฉ์„ ์งœ์ง‘์–ด์„œ Standard Convolution ์—ฐ์‚ฐ์„ ์„ค๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ Convolution์„ ํ†ต๊ณผํ•˜๋ฉด ํ•˜๋‚˜์˜ Feature Map(Activation Map)์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. 

( pytorch์—์„œ out_channels์„ ํ†ตํ•ด Feature Map์˜ ๊ฐœ์ˆ˜๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. )

 

์ด๋•Œ Feature Map ํ•œ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ Kernel Size x Kernel Size x Input Channel(์ž…๋ ฅ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜)์˜ Parameter๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

1. Standard Convolution vs Depth-wise Convolution

 

(์ƒ‰์œผ๋กœ ๋น„๊ตํ•˜์‹œ๋ฉด์„œ ๋ณด์‹ญ์‹œ์˜ค. )

ํ•˜๋‚˜์˜ Feature Map = Kernel Size x Kernel Size x 3

 

 

 

 

๋ฐ˜๋ฉด, Depth-wise์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ฐจ์ด๋ฅผ ์•„์‹œ๊ฒ ๋‚˜์š”? 

 

Depth-wise Convolution์€ ํ•œ ๋ฒˆ ํ†ต๊ณผํ•˜๋ฉด, ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š๊ณ , (R, G, B)๊ฐ€ ๊ฐ๊ฐ Feature Map์ด ๋ฉ๋‹ˆ๋‹ค. 

 

3 x Feature Map = Kernel Size x Kernel Size x 3

 

์ •๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด,

 

ํ•˜๋‚˜์˜ Feature Map = Kernel Size x Kernel Size

 

๋‘ ๊ฐœ๋ฅผ ๋…ผ๋ฌธ Figure๋กœ ๋น„๊ตํ•˜๋ฉด, 

 

 Depth-wise Convolution์—์„œ ์—ฐ์‚ฐ๋Ÿ‰์ด Input Channel ๋งŒํผ ์—ฐ์‚ฐ๋Ÿ‰์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. 

 

 

2. Separable Convolution

 

Separable Convolution์€ Point-wise Convolution ์ž…๋‹ˆ๋‹ค.

 

Point-wise Convolution๋Š” 1x1 Convolution์ž…๋‹ˆ๋‹ค. 

 

coding-yoon.tistory.com/116

 

[๋”ฅ๋Ÿฌ๋‹] DeepLearning CNN BottleNeck ์›๋ฆฌ(Pytorch ๊ตฌํ˜„)

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ Deep Learning ๋ถ„์•ผ์—์„œ CNN์˜ BottleNeck๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ResNet์—์„œ BottleNeck์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ResNet์—์„œ ์™ผ์ชฝ์€ BottleNeck ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ณ , ์˜ค๋ฅธ์ชฝ์€..

coding-yoon.tistory.com

1x1 Convolution์˜ ์—ญํ• ์„ ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์œ„ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. 

 

1x1 Convolution์€ ๋‘ ๊ฐ€์ง€ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค .

 

(1) ๊ณต๊ฐ„์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค.

(2) ์—ฐ์‚ฐ๋Ÿ‰์ด ๊ฐ€์žฅ ์ ๊ฒŒ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Feature Map ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. 

 

 

 

 

 

 

3. Depth-wise Separable Convolution

 

 

(2) Pointwise Convolution์—์„œ BottleNeck๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜์…จ์œผ๋ฉด, ๋ฐ”๋กœ ๊ฐ์ด ์˜ค์‹ค ๊ฒ๋‹ˆ๋‹ค. 

 

 

BottleNeck์˜ ๊ตฌ์กฐ ํ•ต์‹ฌ์€ ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ๊ณณ์€ ์ตœ๋Œ€ํ•œ Feature Map์„ ์ ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ์‚ฐ๋Ÿ‰์ด ๋‚ฎ์€ ๊ณณ์—์„œ Feature Map์„ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

Depth-wise Convolution์ด ์—ฐ์‚ฐ๋Ÿ‰์ด ์ ๋‹ค ํ•˜๋”๋ผ๋„, Point-wise Convolution์— ๋น„ํ•˜๋ฉด ์—ฐ์‚ฐ๋Ÿ‰์ด ๊ต‰์žฅํžˆ ๋งŽ์€ ํŽธ์ž…๋‹ˆ๋‹ค. 

 

Depth-wise Convolution์—์„œ Feature Map์„ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ๋ฝ‘์•„๋‚ด๊ณ , Point-wise Convolution์—์„œ Feature Map์„ ํ•„์š”ํ•œ ๋งŒํผ ๋ฝ‘์•„๋ƒ…๋‹ˆ๋‹ค.

 

 

 

 

 

3. vs Depth-wise Separable Convolution

 

๋‘ ์‹์„ ์ •๋ฆฌํ•˜๋ฉด, ์ตœ์ข…์ ์œผ๋กœ ๊ณฑ์…ˆ์ด ๋ง์…ˆ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

๋ณดํ†ต Kernel Size๋ณด๋‹ค Output Channel์ด ํ›จ์”ฌ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์•ฝ Kernel size ์ œ๊ณฑ๋งŒํผ์˜ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

์ด๋ฅผ Pytorch๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 

class depthwise_separable_conv(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(depthwise_seperable_conv, self).__init__()
        self.depthwise = nn.Conv2d(input_dim, input_dim, kernel_size=3, padding=1,
                                                              groups=input_dim)
        self.pointwise = nn.Conv2d(input_dim, output_dim, kernel_size=1)

    def forward(self, x):
        x = self.depthwise(x)
        x = self.pointwise(x)
        
       return x

 

Convolution์—์„œ groups๋ผ๋Š” ์ธ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ง ๊ทธ๋Œ€๋กœ Input Channel์„ ์–ผ๋งˆ๋งŒํผ ๊ทธ๋ฃน ์ง€์–ด์„œ ์ถœ๋ ฅํ• ์ง€ ์ •ํ•˜๋Š” ์ธ์ž์ž…๋‹ˆ๋‹ค. 

 

 Group์„ ์ตœ๋Œ€๋กœ ์ง€์œผ๋ฉด, ๊ฒฐ๊ตญ ์„œ๋กœ ๊ฐ๊ฐ์˜ ๋…๋ฆฝ์ ์ธ ๊ณ„์‚ฐ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

์•„๋ž˜ Pytorch Document๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. 

 

pytorch.org/docs/stable/generated/torch.nn.Conv2d.html?highlight=conv2d#torch.nn.Conv2d

 

Conv2d โ€” PyTorch 1.7.0 documentation

Shortcuts

pytorch.org

 

728x90
๋ฐ˜์‘ํ˜•
18์ง„์ˆ˜