沈阳建立网站,有没有做门面设计的网站,秦皇岛app开发公司,网站建设自主建设文章目录 逐通道卷积#xff08;Pointwise Convolution#xff0c;1x1 卷积#xff09;主要作用逐通道卷积的操作过程优势代码示例典型应用 膨胀卷积#xff08;Dilated Convolution#xff09;主要作用工作原理膨胀率 (dilation rate) 的定义代码实例膨胀卷积的优点 组卷… 文章目录 逐通道卷积Pointwise Convolution1x1 卷积主要作用逐通道卷积的操作过程优势代码示例典型应用 膨胀卷积Dilated Convolution主要作用工作原理膨胀率 (dilation rate) 的定义代码实例膨胀卷积的优点 组卷积Group Convolution主要作用工作原理普通卷积分组卷积 代码实例 深度可分离卷积Depthwise Separable Convolution主要作用深度卷积Depthwise Convolution原理实现方法 1*1卷积原理实现方法 代码 参考 CNN 理解神经网络中卷积(大小通道数深度)
逐通道卷积Pointwise Convolution1x1 卷积
逐通道卷积Pointwise Convolution也称为 1x1 卷积是一种特殊的卷积操作其中卷积核的大小为 1x1。
这种卷积操作不会覆盖空间维度height 和 width而是只作用于每个位置上的所有通道这使得逐通道卷积主要用于调整通道数量或整合通道信息。
主要作用 降维 dimension reductionality 比如一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积那么结果的大小为500×500×20。就是改变了输入和输出的通道数可以减少参数。 增加非线性卷积层之后经过激励层1*1的卷积在前一层的学习表示上添加了非线性激励 non-linear activation 提升网络的表达能力很明显增加了非线性因为相当于又进行了一次运算。 逐通道卷积的操作过程
逐通道卷积对输入特征图的每个空间位置都使用一个 1x1 的卷积核来进行计算因此该操作不改变特征图的空间分辨率height 和 width而是针对通道进行操作。
例如假设输入特征图的大小为 [height, width, channels_in]逐通道卷积会 仅在每个空间位置的通道维度上进行加权求和输出为 [height, width, channels_out]。 通过多个 1x1 卷积核堆叠实现对所有通道的线性组合从而调整通道数量。
优势 降维或升维可以调整通道数例如从较高的通道数降维为较低的通道数或从较低的通道数升维为较高的通道数。 减少计算量在深层网络中先通过 1x1 卷积减少通道数再应用较大卷积核可以降低计算复杂度。 融合通道信息通过对不同通道进行线性组合逐通道卷积可以聚合通道之间的信息从而提取到更丰富的特征。
代码示例
在这个例子中1x1 卷积调整了通道数从 64 转换为 128但空间分辨率height 和 width保持不变即32x32。
import torch
import torch.nn as nn# 定义1x1逐通道卷积
conv1x1 nn.Conv2d(in_channels64, out_channels128, kernel_size1)# 输入一个大小为 (batch_size, 64, height, width) 的特征图
input_tensor torch.randn(1, 64, 32, 32)
output_tensor conv1x1(input_tensor)print(输出特征图形状:, output_tensor.shape) # (1, 128, 32, 32)典型应用 通道整合用于将特征进行通道混合常用于 MobileNet 和 ResNet 等网络结构。 深度可分离卷积在深度可分离卷积中逐通道卷积和深度卷积结合形成一种高效的特征提取方式显著减少参数和计算量。 调整特征图维度在网络的不同层之间通过 1x1 卷积来匹配不同层的通道数。
膨胀卷积Dilated Convolution
参考空洞卷积膨胀卷积的相关知识以及使用建议HDC原则
膨胀卷积Dilated Convolution又称为扩张卷积或空洞卷积是一种特殊的卷积操作它通过在卷积核的元素之间插入间隔称为膨胀率或扩张率来扩大感受野。这样一来膨胀卷积在不增加参数数量和计算量的前提下可以获取更大的上下文信息。 在nn.conv2d中由dilation参数决定。 主要作用 增大感受野 保持原输入特征图的高度和宽度
工作原理
在标准卷积中每个卷积核会直接作用于相邻的输入像素。而在膨胀卷积中通过在卷积核元素之间引入空隙使得卷积核可以“跳跃”着查看更远的像素感受野因此被扩大。
例如假设一个 3x3 的标准卷积核作用在输入特征图上。对于膨胀率为 2 的膨胀卷积卷积核会在每个元素之间留出 1 个空位相当于“跳”过一个像素。这种操作使得卷积核感知更大区域的特征而无需增加参数。 膨胀率 (dilation rate) 的定义
膨胀卷积的核心参数是膨胀率 d它决定了卷积核的“跳跃”距离
当 d1 时膨胀卷积退化为标准卷积。当 d2 时卷积核的每个元素之间有 1 个空隙即相隔 2 个像素。当 d3 时卷积核的每个元素之间有 2 个空隙即相隔 3 个像素。
计算公式 输出尺寸 输入尺寸 − 膨胀卷积核尺寸 步幅 1 输出尺寸 \frac{输入尺寸-膨胀卷积核尺寸}{步幅}1 输出尺寸步幅输入尺寸−膨胀卷积核尺寸1 代码实例
import torch
import torch.nn as nn# 使用膨胀率为2的3x3卷积核
dilated_conv nn.Conv2d(in_channels1, out_channels1, kernel_size3, dilation2)# 创建一个输入特征图
input_tensor torch.randn(1, 1, 7, 7)
output_tensor dilated_conv(input_tensor)
# (1, 1, 3, 3)
print(输出特征图形状:, output_tensor.shape)膨胀卷积核大小33-1*2-15输出尺寸7-5/113
因此输出是 (1, 1, 3, 3)
膨胀卷积的优点
扩大感受野无需增加计算量就可以获取更大的感受野。减少信息丢失相比使用较大的步幅或池化层膨胀卷积不会丢失输入特征图的空间分辨率。提高网络性能在图像分割和目标检测中常用可以更好地捕捉多尺度的上下文信息。
组卷积Group Convolution
参考卷积 - 3. 分组卷积 详解
组卷积Group Convolution是一种将通道分组的卷积方法主要用于减少计算量提升模型效率。 在nn.conv2d中由groups参数决定。 主要作用
通过将输入特征图的通道分成多个独立的组每个组内进行单独的卷积运算从而降低计算复杂度。
工作原理
普通卷积 输入特征为 (H × W × C) 然后应用 C’ 个filters每个filter的大小为 h × w × c输入层被转换为大小为 H × W × C 的输出特征
分组卷积 分组操作假设输入有 C 个通道组卷积会将这些通道分成 G 组。每个组包含 C G \frac{C}{G} GC个通道。 独立卷积每一组通道都会用各自的卷积核进行卷积。每组的计算是独立的不会和其他组互相影响。 输出拼接对每组通道的卷积操作完成后组卷积将各组输出拼接在一起形成最终的输出。
代码实例
import torch
import torch.nn as nn# 创建一个组卷积层输入和输出通道数都为64卷积核大小为3x3分组数为4
group_conv nn.Conv2d(in_channels64, out_channels64, kernel_size3, padding1, groups4)# 输入特征图形状为[批次大小, 通道数, 高度, 宽度]
input_tensor torch.randn(1, 64, 32, 32)# 进行组卷积操作
output_tensor group_conv(input_tensor)
# 输出特征图形状: torch.Size([1, 64, 32, 32])
print(输出特征图形状:, output_tensor.shape)深度可分离卷积Depthwise Separable Convolution
深度可分离卷积Depthwise Separable Convolution 是一种将标准卷积操作拆分为两个独立操作的卷积方式目的是降低计算复杂度和提高效率。
深度可分离卷积将标准卷积操作分解成两个更简单的卷积步骤
深度卷积Depthwise Convolution逐点卷积Pointwise Convolution 主要作用
通过将传统卷积操作拆分成两步显著减少了计算量和参数量是一种高效的卷积方式特别适合在移动设备等资源有限的环境中应用。
深度卷积Depthwise Convolution
在传统卷积中一个卷积核会与输入图像的所有通道进行卷积。 一个大小为64×64像素、3通道彩色图片经过4个Filters输出为4张32x32的特征图 原理
而在深度卷积中每个输入通道都使用一个单独的卷积核进行卷积。如果输入特征图有 C 个通道就会用 C 个卷积核来进行卷积每个卷积核只对单个通道进行卷积操作。 一个大小为64×64像素、3通道彩色图片3个单通道卷积核分别进行卷积计算输出3个单通道的特征图。所以一个3通道的图像经过运算后生成了3个Feature map如下图所示。 深度卷积 输入特征图通道数卷积核个数输出特征图个数
实现方法 # 深度卷积每个通道使用独立的卷积核
self.depthwise nn.Conv2d(in_channels, in_channels, kernel_sizekernel_size, paddingpadding, groupsin_channels)可以看到 in_channels和out_channels都是相同的输入特征图通道数卷积核个数输出特征图个数 卷积的设置参数中groupsin_channels有几个通道数就分成几个组即就安排几个卷积进行分通道操作。
1*1卷积
在深度卷积之后通常会使用一个 1x1 卷积即逐点卷积它的作用是将深度卷积的输出进行通道间的混合。 根据深度卷积可知输入特征图通道数卷积核个数输出特征图个数这样会导致输出的特征图个数过少或者说输出特征图的通道数过少可看成是输出特征图个数为1通道数为3从而可能影响信息的有效性。此时就需要进行逐点卷积。
原理
逐点卷积Pointwise ConvolutionPWConv 实质上是用1x1的卷积核进行升维。在GoogleNet中大量使用1x1的卷积核那里主要是用来降维。1x1的卷积核主要作用是对特征图进行升维和降维。
从深度卷积得到的3个单通道特征图经过4个大小为1x1x3卷积核的卷积计算输出4个特征图而输出特征图的个数取决于Filter的个数。
实现方法
# 逐点卷积1x1卷积对通道进行组合self.pointwise nn.Conv2d(in_channels, out_channels, kernel_size1)代码
import torch
import torch.nn as nnclass DepthwiseSeparableConv(nn.Module):def __init__(self, in_channels, out_channels, kernel_size3, padding1):super(DepthwiseSeparableConv, self).__init__()# 深度卷积每个通道使用独立的卷积核self.depthwise nn.Conv2d(in_channels, in_channels, kernel_sizekernel_size, paddingpadding, groupsin_channels)# 逐点卷积1x1卷积对通道进行组合self.pointwise nn.Conv2d(in_channels, out_channels, kernel_size1)def forward(self, x):x self.depthwise(x) # 深度卷积x self.pointwise(x) # 逐点卷积return x# 创建一个输入张量
input_tensor torch.randn(1, 64, 32, 32) # [batch_size, channels, height, width]# 创建一个深度可分离卷积层输入通道为64输出通道为128
model DepthwiseSeparableConv(64, 128)# 进行前向传播
output_tensor model(input_tensor)
print(输出特征图形状:, output_tensor.shape)