深度可分离卷积(计算过程及代码实现)

一、基本介绍

        深度可分离卷积是对传统卷积的改进,通过拆分空间维度和通道维度的相关性,减少了卷积计算所需要的参数个数。深度可分离卷积计算主要包含两个部分,第一部分是Depthwise Convolution ,将通道拆分,每个通道用一个单独的卷积核卷积。即卷积核的个数等于输入特征的通道数,并且每个卷积核只有一个通道。第二部分是Pointwise Convolution,是为1×1卷积,卷积核通道数和输入的通道数相同。

二、传统卷积计算过程

        在传统的卷积过程中,卷积核的通道数需和输入的通道数相同,每个卷积核的运算包含两部分,第一部分是卷积核相应通道与输入的相应通道进行卷积运算(对应位置相乘再相加),第二部分是将不同通道卷积结果相加得到通道数为1的特征图。n个卷积核最终得到通道数为n的输出。

二、深度可分离卷积计算过程

 

        深度可分离卷积分为两个模块,第一个部分是depthwise convolution,与传统卷积过程不同,depthwise卷积将通道分离,并且卷积核个数和输入特征的通道数相同,每个卷积核的通道数都为1,一个卷积核只对一个通道做运算。最终生成的特征通道数和输入的通道数相同。

第二部分是pointwise convolution,该部分主要有两个功能:

1、自由设置输出的通道数大小,输出通道数等于pointwise convolution中一维卷积核个数。

2、融合通道间信息,depthwise卷积忽略了通道间信息,通过一维卷积可以融合通道间的信息。

三、深度可分离卷积实现

实现深度可分离卷积:

import torch
from torch import nn
from torchsummary import summary
class depth_separable(nn.Module):
    def __init__(self, in_channels:int, out_channels:int) -> None:
        super(depth_separable,self).__init__()
        self.depth_conv = nn.Conv2d(   #和常规卷积不同就是设置了groups参数
        in_channels,
        in_channels,
        kernel_size=3,
        stride=1,
        groups=in_channels,      #groups设置为输入通道数,可以使逐通道卷积
        )
        self.point_conv = nn.Conv2d(   #实现点卷积
        in_channels,
        out_channels,
        kernel_size=1,
        )
    def forward(self, x):

        return self.point_conv(self.depth_conv(x))
    
class mydepth_separable(nn.Module):
    def __init__(self) -> None:
        super(mydepth_separable,self).__init__()
        self.conv2d = depth_separable(3,8)
        self.relu = nn.ReLU()
    def forward(self, x):
        
        return self.relu(self.conv2d(x))
device = torch.device("cuda" )
model=mydepth_separable().to(device)
summary(model, (3, 5, 5))     #查看参数量(3,5,5)表示输入的尺寸是5×5×3

 参数结果:

 可以看到depthwise卷积后的输出是3×3×3,参数量是30,点卷积的输出是3×3×8,参数量是32,这里的参数量包含了偏置。

普通卷积:

import torch
from torch import nn
from torchsummary import summary
class conv(nn.Module):
    def __init__(self, in_channels:int, out_channels:int) -> None:
        super(conv,self).__init__()
        self.conv = nn.Conv2d(   
        in_channels,
        out_channels,
        kernel_size=3,
        stride=1,
        )
    def forward(self,x):
        return self.conv(x)
class myconv(nn.Module):
    def __init__(self) -> None:
        super(myconv,self).__init__()
        self.conv2d=conv(3,8)
        self.relu=nn.ReLU()
    def forward(self,x):
        return self.relu(self.conv2d(x))
device = torch.device("cuda" )
model1=myconv().to(device)
summary(model1, (3, 5, 5))  

         对比普通卷积和深度可分离卷积,深度可分离卷积一共仅需62个参数,而普通卷积需要224个参数,这就是深度可分离模块的作用,大大地减少了参数量。但是,参数量减少的同时也可能出现模型性能下降的可能,因此如何在降低网络规模的同时保证网络的性能也是轻量型网络的研究热点。

深度卷积和深度可分离卷积代码实现会有所不同。以下是它们的代码实现示例: 深度卷积的代码实现: ```python import tensorflow as tf # 输入张量 input_tensor = tf.placeholder(tf.float32, shape=[None, height, width, channels]) # 卷积核 kernel = tf.Variable(tf.truncated_normal([kernel_size, kernel_size, input_channels, output_channels], stddev=0.1)) # 深度卷积 conv_output = tf.nn.conv2d(input_tensor, kernel, strides=[1, stride, stride, 1], padding='SAME') ``` 深度可分离卷积代码实现: ```python import tensorflow as tf # 输入张量 input_tensor = tf.placeholder(tf.float32, shape=[None, height, width, channels]) # 深度可分离卷积 depthwise_output = tf.nn.depthwise_conv2d(input_tensor, depthwise_filter, strides=[1, stride, stride, 1], padding='SAME') pointwise_output = tf.nn.conv2d(depthwise_output, pointwise_filter, strides=[1, 1, 1, 1], padding='SAME') ``` 在以上代码示例中,`input_tensor`表示输入张量,`kernel`表示卷积核,`conv_output`表示深度卷积的输出。对于深度可分离卷积,`depthwise_output`表示Depthwise Convolution的输出,`pointwise_output`表示Pointwise Convolution的输出。这里的代码只是示例,实际实现可能会有所不同,具体的实现方式会根据使用的深度学习框架而有所差异。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [深度可分离卷积](https://blog.csdn.net/zfjBIT/article/details/127521956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [深度可分离卷积计算过程代码实现)](https://blog.csdn.net/m0_45267220/article/details/130291855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值