์•ˆ๋…•ํ•˜์„ธ์š”. ์ €๋ฒˆ Depthwise Separable Convolution ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ๊ธ€์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ ์ด ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ Xception ๋…ผ๋ฌธ์— ๋Œ€ํ•ด ๋ฆฌ๋ทฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

https://openaccess.thecvf.com/content_cvpr_2017/html/Chollet_Xception_Deep_Learning_CVPR_2017_paper.html

 

CVPR 2017 Open Access Repository

Francois Chollet; Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017, pp. 1251-1258 We present an interpretation of Inception modules in convolutional neural networks as being an intermediate step in-between regular

openaccess.thecvf.com

 

์šฐ์„ , Xception์„ ๋ฆฌ๋ทฐํ•˜๊ธฐ ์ „ Inception์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

Inception ๋ชจ๋“ˆ๋กœ 2014๋…„๋„์— ๊ฐ€์žฅ ๋†’์€ ์„ฑ์ ์„ ๊ฑฐ๋‘” GoogleLeNet ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

1. Inception Module

 

 

Inception Module

 

์ธ์…‰์…˜ ๋ชจ๋“ˆ์€ ์ด์ „ ๋‹จ๊ณ„์˜ ํ™œ์„ฑํ™” ์ง€๋„์— ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ ํฌ๊ธฐ(Kernel_Size)๋กœ ํ•ฉ์„ฑ๊ณฑ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด, ๊ฐ•์•„์ง€ ์‚ฌ์ง„์—์„œ ๊ท€, ์ฝ”, ๋ˆˆ ๋“ฑ์˜ ํŠน์ง•์„ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ๋ณด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ๊ฐ•์•„์ง€ ์‚ฌ์ง„์—์„œ ๋‹ค๋ฅธ ํŠน์„ฑ๋“ค์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ธ์…‰์…˜์€ ์ ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋‹ค์–‘ํ•œ ํŠน์ง•๊ฐ’์„  ์ถ”์ถœํ•˜๋Š”๋ฐ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

class InceptionModule(nn.Module):
    def __init__(self, n_channels=10):
        super(InceptionModule, self).__init__()
        # Sequential : ์—ฐ์‚ฐ์„ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰

        self.conv2d_3k = nn.Conv2d(in_channels=n_channels,
                                   out_channels=n_channels,
                                   kernel_size=3,
                                   padding=1)

        self.conv2d_1k = nn.Conv2d(in_channels=n_channels,
                                   out_channels=n_channels,
                                   kernel_size=1)

        self.avgpool2d = nn.AvgPool2d(kernel_size=1)

    def forward(self, x):
        y1 = self.conv2d_1k(x)

        y2_1 = self.conv2d_1k(x)
        y2_2 = self.conv2d_3k(y2_1)

        y3_1 = self.avgpool2d(x)
        y3_2 = self.conv2d_3k(y3_1)

        y4_1 = self.conv2d_1k(x)
        y4_2 = self.conv2d_3k(y4_1)
        y4_3 = self.conv2d_3k(y4_2)

        out = torch.cat([y1, y2_2, y3_2, y4_3], dim=1)

        return out

 

 

2. ๋‹จ์ˆœํ•œ Inception Module

A Simplified Inception Module

 

์ €๋ฒˆ ๊ธ€์— ๋‚˜์˜จ Depthwise Separable Convolution์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ธ spartial correlation(3x3 convolution)๊ณผ cross channel correlation(1x1 convolution)์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. 

 

์—ฌ๊ธฐ Standard Convolution๊ณผ ์ฐจ๋ณ„ ์ ์€ ์„œ๋กœ๊ฐ€ ๋งคํ•‘(mapping)๋˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Figure1์˜ ๋ณต์žกํ•จ์„ ์ตœ๋Œ€ํ•œ Simpleํ•˜๊ฒŒ ๊ฐ€๋Š”๋ฐ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

class SimplyInceptionModule(nn.Module):
    def __init__(self, n_channels=10):
        super(SimplyInceptionModule, self).__init__()
        # Sequential : ์—ฐ์‚ฐ์„ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰

        self.conv2d_3k = nn.Conv2d(in_channels=n_channels,
                                   out_channels=n_channels,
                                   kernel_size=3,
                                   padding=1)

        self.conv2d_1k = nn.Conv2d(in_channels=n_channels,
                                   out_channels=n_channels,
                                   kernel_size=1)

    def forward(self, x):
        y1_1 = self.conv2d_1k(x)
        y1_2 = self.conv2d_3k(y1_1)

        y2_1 = self.conv2d_1k(x)
        y2_2 = self.conv2d_3k(y2_1)

        y3_1 = self.conv2d_1k(x)
        y3_2 = self.conv2d_3k(y3_1)

        out = torch.cat([y1_2, y2_2, y3_2], dim=1)

        return out

 

 

3. ๋” ๋‹จ์ˆœํ•œ Inception module

A strictly equivalent reformulation of the simplified Inception module

 

Figure2์—์„œ 1x1 Convolution์„ Input๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด,

 

Figure3์—์„œ๋Š” 1x1 Convolution์„ input ํ•œ ๋ฒˆ๋งŒ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

1x1 Convolution ์ˆ˜ํ–‰ํ•œ output์„ (๊ทธ๋ฃน์œผ๋กœ) ๋ถ„๋ฆฌํ•˜์—ฌ 3x3 Convolution์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

Figure2๋ฅผ ๋ณ€ํ˜•ํ•˜์—ฌ ๋” Simpleํ•˜๊ฒŒ!

 

SimplyInceptionModule3 = nn.Sequential(
    nn.Conv2d(in_channels=9,
              out_channels=9,
              kernel_size=1,
              bias=False),
              
    nn.ReLU(),

    nn.Conv2d(in_channels=9,
              out_channels=9,
              kernel_size=3,
              groups=3,
              bias=False),
    
    nn.ReLU()

)

 

 

 

 

์ด ๋…ผ๋ฌธ์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. 

 

 This observation naturally raises the question: 
 
 ์ด ๊ด€์ฐฐ์€ ๋‹น์—ฐํžˆ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
 
 what is the effect of the number of segments in the partition (and their size)?
 
 ํŒŒํ‹ฐ์…˜์˜ ์„ธ๊ทธ๋จผํŠธ ์ˆ˜ (๋ฐ ํฌ๊ธฐ)๋Š” ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๊นŒ?
 

 

 

 

 

4. Extreme version of Inception module

Figure3์—์„œ Output Channels๋ฅผ ์ตœ๋Œ€๋กœ ๊ทธ๋ฃน์„ ์ง€์–ด ๋ถ„๋ฆฌํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋ฉด ์–ด๋–จ๊นŒ?

 

An Extreme version of Inception module

 

์œ„ ๋…ผ๋ฌธ์˜ ์งˆ๋ฌธ์˜ ๊ฐ€์„ค๋กœ,  ํŒŒํ‹ฐ์…˜์˜ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ตœ๋Œ€ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

 

ExtremeInception = nn.Sequential(
    nn.Conv2d(in_channels=9,
              out_channels=9,
              kernel_size=1,
              bias=False),
              
    nn.ReLU(),

    nn.Conv2d(in_channels=9,
              out_channels=9,
              kernel_size=3,
              groups=9,
              bias=False),
    
    nn.ReLU()

)

 

 

We remark that this extreme version of an Inception module is almost identical to a depthwise 
separable convolution, an operation that has been used in neural network design as early as 
2014 and has become more popular since its inclusion in the TensorFlow framework in 2016.


An extreme version of Inception module์€ 2014 ๋…„ ์ดˆ ์‹ ๊ฒฝ๋ง ์„ค๊ณ„์— ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ 2016 ๋…„ TensorFlow ํ”„๋ ˆ์ž„ ์›Œํฌ์— 
ํฌํ•จ ๋œ ์ดํ›„ ๋” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” Depthwise Separable Convolution๊ณผ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

 

depthwise separable convolution ์™€ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ๋ชจ๋“ˆ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

depthwise separable convolution๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋ฉด

 

https://coding-yoon.tistory.com/77

 

[๋”ฅ๋Ÿฌ๋‹] Depthwise Separable Covolution with Pytorch( feat. Convolution parameters VS Depthwise Separable Covolution paramet

์•ˆ๋…•ํ•˜์„ธ์š”. Google Coral์—์„œ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ํ†ตํ•ด ์ถ”๋ก ์„ ํ•  ์ˆ˜ ์žˆ๋Š” Coral Board & USB Accelator ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Coral Board๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด4์— USB Accelator๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ƒ๊ฐ์ž…๋‹ˆ..

coding-yoon.tistory.com

 

Xception์„ ํ•œ ๋ฒˆ์— ์ž‘์„ฑํ• ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ์“ธ ๊ฒƒ์ด ๋งŽ์•„ 2ํŽธ ์ •๋„๋กœ ์—ฐ์žฅ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

 

์ฒซ ๋…ผ๋ฌธ ๋ฆฌ๋ทฐ์ธ๋ฐ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

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