卷积使用
# 输入通道数、输出通道数、卷积核大小、步长、补几圈零、
Conv2d(in_channels=3, out_channels=32, kernel_size=(3, 3), stride=1, padding=0),
必填
in_channels 输入通道数
out_channels 输出通道数
选填
kernel_size 卷积核大小
stride 步长
padding 补几圈零
bias=False 是否加偏置
特殊
padding_mode=“zeros”
zeros(常量填充),默认情况是使用0填充,可选择整形int或者tuple元组
reflect(反射填充),以矩阵中的某个行或列为轴,中心对称的padding到最外围。
replicate(复制填充),replicate将矩阵的边缘复制并填充到矩阵的外围
circular(循环填充),从上到下进行无限的重复延伸
深度可分离卷积
groups=in_channels
卷积类别
分为两种:轻量、高精度、
降低模型计算量:分组卷积可分离卷积(深度、空间)
分组卷积: ResNeXt、 ShuffleNet系列
可分离卷积: MobileNet系列
提高模型精度:空洞卷积、多尺度卷积、形变卷积、
空洞卷积:图像语义分割的DeepLab系列
多尺度卷积: Inception系列、注意力模型SKNet
形变卷积: DCN V1、DCN V2、这两篇论文
深度可分离卷积
减少参数与运算量
每个通道都由1个独立的卷积核进行卷积,然后使用(11通道数)贯穿所有的通道进行卷积。反过来也可以
逐层卷积+逐点卷积
分组卷积
减少参数与运算量
将特征图按照通道分为若干组,每个组由一个独立的卷积核负责卷积。
多尺度卷积
识别大小经常变化的物体(提取不同感受野的特征)
将不同大小的卷积核对同一个特征图进行卷积。
普通卷积原理
import torch
import torch.nn.functional as F
x = torch.tensor([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]])
y = torch.tensor([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
# 改变维度 参数:数据矩阵,目标大小矩阵
x1 = torch.reshape(x, (1, 1, 5, 5))
y1 = torch.reshape(y, (1, 1, 3, 3))
# 自由指定补几圈零
# 步长默认是1、补几圈零、
output = F.conv2d(x1, y1, stride=1, padding=1)
# 指定模式
# `padding='same'`表示进行填充,填充的值由算法内部根据卷积核大小计算,目的是让输出尺寸和输入相等;
# `padding='valid'`表示不进行填充,即是 padding=0,只使用有效的窗口位置,这是默认的选项。
output1 = F.conv2d(x1, y1, stride=1, padding="valid")
output2 = F.conv2d(x1, y1, stride=1, padding="same")
print(output)
print(output1)
print(output2)
01+02+03+01+12+23+01+12+2*3=16