mobile net 的 depthwise conv 和 origin conv 的对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xueyingxue001/article/details/78205152

在inputchannel = k,outputchannel = q的情况下。

Mobilenet convorigin conv拆成了depthwise conv+pointwise conv,如下:

                Mobilenet conv:

                                depthwiseconv filter shape:[di,dj, k, channel_multiplier],channel_multiplier默认=1

                                pointwiseconv filter shape:[1,1, k*channel_multiplier, q]

                因为pointwise conv就是origin conv,所以下面只对比depthwise conv和origin conv。

 

关于output channel数:

                origin conv         :              

                              output channel = q(output channel数)

                depthwise conv               :              

                              output channel = k(input channel数)

               PS:实际上outputchannel = k*channel_multiplier,但channel_multiplier默认=1

详情:

                origin conv:

                                outout: [b, i, j, q]

                depthwise conv:

                                for _k in 0..(k-1):

                                                for _q in 0..(channel_multiplier-1):

                                                                outout: [b, i, j, _k*channel_multiplier + _q]

                                因channel_multiplier默认= 1,所以可以写成:outout: [b, i, j, k]

关于算法实现:

                origin conv output channel 的每一层是:

                               in_channel_0*filter_0 + in_channel_1*filter_1+ ... + in_channel_k*filter_k

                depthwise conv output channel 的每一层是:

                                in_channel_i*filter_0

                                PS:实际上是:

                                             for i in0..(in_channel-1):

                                                                forj in 0..(channel_multiplier-1):

                                                                                in_channel_i*filter_j

                                因为channel_multiplier默认为=1,所以可以写成:in_channel_i*filter_0

详情:

                origin conv:

                              output[b,i,j,0] = sum_{di,dj,k} input[b, strides[1]*i + di, strides[2] * j + dj,k] * filter[di, dj,k, 0]

                              output[b,i,j,1] = sum_{di,dj,k} input[b, strides[1]*i + di, strides[2] * j + dj,k] * filter[di, dj,k, 1]

                              ......

                              output[b,i,j,q] = sum_{di,dj,k} input[b, strides[1]*i + di, strides[2] * j + dj,k] * filter[di, dj,k, q]

                depthwise conv:

                              output[b,i,j, 0] = sum_{di, dj} input[b, strides[1] * i + di, strides[2] * j + dj,0] * filter[di, dj,0, 0]

                              output[b,i,j, 1] = sum_{di, dj} input[b, strides[1] * i + di, strides[2] * j + dj,1] * filter[di, dj,1, 0]

                              ......

                              output[b,i, j, k] = sum_{di, dj} input[b, strides[1] * i + di, strides[2] * j + dj,k] * filter[di, dj,k, 0]

                              PS:实际上是

                                             for _k in 0..(k-1):

                                                            for _q in 0..(channel_multiplier-1):

                                                                           output[b, i, j, _k*channel_multiplier+_q] = sum_{di, dj} input[b, strides[1] * i + di, strides[2] * j + dj, _k] * filter[di, dj, _k, _q]

                              因为 depthwise conv 的 filter 的 q 默认为 1,所以可以写成上面的形式

最后

               结合上面这些,论文中的这张图应该就很明了了:


猜你喜欢

转载自blog.csdn.net/xueyingxue001/article/details/78205152
今日推荐