深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码

简介: 本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。

1. 摘要🎄

本文介绍了深度可分离卷积和空间可分离卷积的概念及其在计算复杂性和效率上的优势。深度可分离卷积通过通道内卷积和1x1卷积减少参数量,而空间可分离卷积将3x3卷积分解为3x1和1x3卷积以降低计算复杂性。代码示例展示了这两种卷积在实际网络结构中的应用,并通过比较计算量表明深度可分离卷积具有更高的效率。

2. 定义🎄

空间可分离卷积:空间可分离卷积是一种将传统卷积操作分解为两个更小操作的方法,通常分为逐行卷积和逐列卷积两个步骤。首先,使用一维卷积核对输入特征图的每一行进行卷积,生成中间特征图;然后,对中间特征图的每一列进行卷积,得到最终输出特征图。这种卷积方式可以减少计算量和参数数量,但并非所有的卷积核都适合进行空间上的分离,因此在深度学习中的应用不如深度可分离卷积广泛。 最常见的情况是将3x3的卷积核划分为3x1和1x3的卷积核,如下所示:
在这里插入图片描述
现在,我们不是用9次乘法进行一次卷积,而是进行两次卷积,每次3次乘法(总共6次),以达到相同的效果。 乘法较少,计算复杂性下降,网络运行速度更快。

import torch
import torch.nn as nn

class SpatiallySeparableConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
        super(SpatiallySeparableConv2d, self).__init__()
        # 检查卷积核大小是否为奇数
        assert kernel_size % 2 == 1, "Kernel size must be odd for spatially separable convolution"

        self.depthwise_row_conv = nn.Conv2d(in_channels, in_channels, kernel_size=(kernel_size, 1),
                                            stride=(stride, 1), padding=((padding//2), 0), groups=in_channels)
        self.depthwise_col_conv = nn.Conv2d(in_channels, out_channels, kernel_size=(1, kernel_size),
                                            stride=(1, stride), padding=(0, (padding//2)), groups=in_channels)

    def forward(self, x):
        x = self.depthwise_row_conv(x)
        x = self.depthwise_col_conv(x)
        return x

# 示例使用
input_tensor = torch.randn(1, 3, 32, 32)  # (batch_size, channels, height, width)
conv = SpatiallySeparableConv2d(in_channels=3, out_channels=8, kernel_size=3, stride=1, padding=1)
output = conv(input_tensor)

print(output.shape)  # 输出的形状

深度可分离卷积:深度可分离卷积(Depthwise Separable Convolution)是一种高效的卷积操作,广泛应用于轻量级神经网络中,如MobileNet和Xception。它将标准卷积操作分解为两个较小的操作:深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。

  1. 深度卷积:在这一步中,每个输入通道独立地应用一个卷积核,这样只捕获空间特征而不混合通道信息。

  2. 逐点卷积:此步骤使用1x1的卷积核对深度卷积的输出进行卷积,目的是组合来自不同通道的特征。

这种分解方法显著减少了计算量和模型参数,同时保持了网络的性能。深度可分离卷积特别适合于计算资源有限的环境,如移动设备和嵌入式系统,深度可分离卷积步骤如下图所示。
在这里插入图片描述

import torch
import torch.nn as nn

class DepthwiseSeparableConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
        super(DepthwiseSeparableConv2d, self).__init__()
        self.depthwise = nn.Conv2d(
            in_channels, in_channels, 
            kernel_size=kernel_size, 
            stride=stride, 
            padding=padding, 
            groups=in_channels
        )
        self.pointwise = nn.Conv2d(
            in_channels, out_channels, 
            kernel_size=1, 
            stride=1, 
            padding=0
        )

    def forward(self, x):
        x = self.depthwise(x)
        x = self.pointwise(x)
        return x

# 示例使用
input_tensor = torch.randn(1, 3, 32, 32)  # (batch_size, channels, height, width)
dconv = DepthwiseSeparableConv2d(in_channels=3, out_channels=8, kernel_size=3, stride=1, padding=1)
output = dconv(input_tensor)

print(output.shape)  # 输出的形状

3. 具体代码分析🎄

import torch.nn as nn
from Module.activation import act_layers

class ConvBNReLU(nn.Sequential):
    def __init__(self,i,o,k,s,p,dilation=(1,1),groups=1,bias=False,activation='ReLU'):
        super(ConvBNReLU, self).__init__()

        self.CBA = nn.Sequential(
            nn.Conv2d(i,o,kernel_size=k,stride=s,padding=p,dilation=dilation,groups=groups,bias=bias),
            nn.BatchNorm2d(o),
            act_layers(activation)
        )
    def forward(self, input):
        x = self.CBA(input)
        return x

class Param(nn.Module):
    def __init__(self,activation='ReLU'):
        super(Param, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 24, kernel_size=3, stride=2, padding=1, bias=False),
            nn.BatchNorm2d(24),
            act_layers(activation)
        )
        # 普通卷积
        self.conv2 = nn.Sequential(
            nn.Conv2d(24, 24, kernel_size=3, stride=1, padding=1, bias=False),
            nn.BatchNorm2d(24),
            act_layers(activation)
        )
        # 深度可分离
        self.conv3 = nn.Sequential(
            self.depthwise_conv(24, 24, kernel_s=3, stride=1, padding=1),
            nn.Conv2d(24, 24, 1),
            nn.BatchNorm2d(24),
            act_layers(activation)
        )
        # 空间可分离
        self.D3x1_D1x3 = nn.Sequential(
            ConvBNReLU(24,24,(3,1),1,p=(1,0),dilation=(1,1),groups=1),
            ConvBNReLU(24,24,(1,3),1,p=(0,1),dilation=(1,1),groups=1)
        )

    @staticmethod
    def depthwise_conv(input_c: int,
                       output_c: int,
                       kernel_s: int,
                       stride: int = 1,
                       padding: int = 0,
                       bias: bool = False) -> nn.Conv2d:
        return nn.Conv2d(in_channels=input_c, out_channels=output_c, kernel_size=kernel_s,
                         stride=stride, padding=padding, bias=bias, groups=input_c)

    def forward(self, x):
        x = self.conv1(x)
        # 普通卷积 258.55M 5.93k
        x = self.conv2(x)
        # 深度可分离 69.57M 1.56K
        x = self.conv3(x)
        # 空间可分离 186.9M 4.25K
        x = self.D3x1_D1x3(x)

        return x

很明显深度可分离卷积参数量和计算复杂度都最小。

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
91 55
|
12天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
83 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN): 从理论到实践
本文将深入浅出地介绍卷积神经网络(CNN)的工作原理,并带领读者通过一个简单的图像分类项目,实现从理论到代码的转变。我们将探索CNN如何识别和处理图像数据,并通过实例展示如何训练一个有效的CNN模型。无论你是深度学习领域的新手还是希望扩展你的技术栈,这篇文章都将为你提供宝贵的知识和技能。
71 7
|
19天前
|
机器学习/深度学习 自然语言处理 算法
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
27 1
|
25天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
|
22天前
|
机器学习/深度学习 算法框架/工具 Python
深度学习的奥秘与实践:从理论到代码
本文将探索深度学习的世界,揭示其背后的原理,并分享如何将这些理论应用到实际编程中。我们将一起踏上一段旅程,从神经网络的基础概念出发,逐步深入到复杂的模型训练和优化技术。你将看到,即使是初学者,也可以实现自己的深度学习项目。
|
9天前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
48 5