mobile net 的 depthwise conv 和 origin conv 的对比

在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,所以可以写成上面的形式

 

 

最后

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


Depthwise Conv2d是一种深度可分离卷积操作。与传统的卷积操作不同,Depthwise Conv2d首先对输入的每个通道进行单独的卷积操作,得到一组特征图。然后,这些特征图通过逐通道求和的方式进行合并,得到最终的输出特征图。 与传统的Conv2d操作相比,Depthwise Conv2d具有以下几个不同之处: 1. 参数数量:Depthwise Conv2d拥有更少的参数数量。因为它对每个输入通道使用单独的卷积核,而不是对所有通道共享一个卷积核。这降低了参数的数量,减少了计算量。 2. 计算效率:由于Depthwise Conv2d对每个通道进行单独的卷积操作,可以并行地进行计算,提高了计算效率。这对于移动设备等资源受限的环境尤为重要。 3. 模型大小:由于参数数量的减少,使用Depthwise Conv2d可以减小模型的大小。这在资源受限的情况下非常有用,例如移动设备上的深度学习模型部署。 4. 特征表示能力:Depthwise Conv2d在提取特征时,可以更好地保留输入数据的细节。因为它对每个通道进行独立卷积,不会将不同通道之间的信息混合起来。这对于某些任务,如图像分割等,可能会有更好的性能表现。 综上所述,Depthwise Conv2d与传统的Conv2d在卷积操作的方式上有所不同,它采用深度可分离卷积的方式,减少了参数数量和计算量,提高了计算效率,同时保留了输入数据的细节。这使得它在资源受限的环境下应用广泛,并且在一些任务中可能具有更好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值