๊ธ์ ๊ฐ๋ ์ฑ์ ์ํด ์๋ ๋งํฌ์ ๋ค์ ์ ๋ฆฌํจ.
https://blog.naver.com/younjung1996/223413266165
์๋ ํ์ธ์. ์ค๋์ CNN์์ Depth-wise Separable Convolution์ ๋ํด ์ด์ผ๊ธฐํด๋ณด๊ฒ ์ต๋๋ค.
Depth-wise separable Convolution์ ๊ฐ์ฅ ์ ํํํ ๊ทธ๋ฆผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง CNN์ ๋ํด ์์ธํ ์ดํด๊ฐ ์์ผ๋ฉด ์ด ๊ทธ๋ฆผ์ ๋ณด๋๋ผ๋ ์ดํด๊ฐ ์ ๊ฐ์ง ์์ต๋๋ค.
์ ๊ทธ๋ฆผ์ ์ดํดํ๊ธฐ ์ํด์๋ 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์ ๋๋ค.
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