彭水网站建设,网站建设天津,国外域名备案,网站建设成功案例宣传#x1f31e;欢迎来到Pytorch的世界 #x1f308;博客主页#xff1a;卿云阁 #x1f48c;欢迎关注#x1f389;点赞#x1f44d;收藏⭐️留言#x1f4dd; #x1f31f;本文由卿云阁原创#xff01; #x1f4c6;首发时间#xff1a;#x1f339;2024年2月21日欢迎来到Pytorch的世界 博客主页卿云阁 欢迎关注点赞收藏⭐️留言 本文由卿云阁原创 首发时间2024年2月21日 ✉️希望可以和大家一起完成进阶之路 作者水平很有限如果发现错误请留言轰炸哦万分感谢 目录 普通卷积 黑白图像中的卷积 填充 步长为3 计算公式 多维卷积 多个卷积核 卷积的三种模式 Pytorch卷积层原理和示例 nn.conv1d nn.conv2d 深度可分离卷积 普通卷积 黑白图像中的卷积 填充 步长为3 计算公式 多维卷积 多个卷积核 卷积的三种模式 深度学习框架中通常会实现三种不同的卷积模式分别是 SAME、VALID、FULL。这三种模式的核心区别在于卷积核进行卷积操作的移动区域不同进而导致输出的尺寸不同。我们以一个例子来看这三种模式的区别输入图片的尺寸是 5×5 卷积核尺寸是 3×3 stride 取 1。 FULL 模式 FULL 模式下卷积核从与输入有一个点的相交的地方就开始卷积。如下图所示蓝框的位置就是卷积核第一个卷积的地方灰色部分是为了卷积能够正常进行的 padding一般填 0。因此 FULL 模式下卷积核移动区域最大卷积后输出的尺寸也最大。 VALID 模式 VALID 模式与 FULL 模式相反在整个卷积核与输入重叠的地方才开始卷积操作因此不需要 padding输出的尺寸也最小。 SAME 模式 SAME 模式是最常用的一种模式SAME 的意思是卷积后输出的尺寸与输入尺寸保持一致假定 stride 为 1。通过将卷积核的中心与输入的第一个点进行对齐确定卷积核起始位置然后补齐对应 padding 即可。如下图所示可以看到卷积输出的尺寸与出入保持一致。 SAME 模式下当卷积核边长为偶数时可以通过在其中一边增加多一行列padding即不对称的 padding 实现输出尺寸与输入尺寸保持一致如下图所示卷积核尺寸为 2×2 以上三种模式区别在于卷积核进行卷积操作的移动区域不同其实是确定了所需的 padding。各种模式 padding 计算如下: def get_padding(inputs, ks, modeSAME):Return padding list in different modes.params: inputs (input array)params: ks (kernel size) [p, q]return: padding list [n,m,j,k]pad Noneif mode FULL:pad [ks[0] - 1, ks[1] - 1, ks[0] - 1, ks[1] - 1]elif mode VALID:pad [0, 0, 0, 0]elif mode SAME:pad [(ks[0] - 1) // 2, (ks[1] - 1) // 2,(ks[0] - 1) // 2, (ks[1] - 1) // 2]if ks[0] % 2 0:pad[2] 1if ks[1] % 2 0:pad[3] 1else:print(Invalid mode)return pad 确定了输入尺寸、卷积核尺寸、padding 以及 stride输出的尺寸就被确定下来可以由以下公式计算。 Pytorch卷积层原理和示例 nn.conv1d conv1d是一维卷积它和conv2d的区别在于只对宽度进行卷积对高度不卷积。 函数定义 torch.nn.functional.conv1d(input, weight, biasNone, stride1, padding0, dilation1, groups1)参数说明: input输入的Tensor数据格式为(batch,channels,W)三维数组第一维度是样本数量第二维度是通道数或者记录数。三维度是宽度。weight卷积核权重也就是卷积核本身。是一个三维数组(out_channels, in_channels/groups, kW)。out_channels是卷积核输出层的神经元个数也就是这层有多少个卷积核in_channels是输入通道数kW是卷积核的宽度。bias位移参数可选项一般也不用管。stride滑动窗口默认为1指每次卷积对原数据滑动1个单元格。padding是否对输入数据填充0。Padding可以将输入数据的区域改造成是卷积核大小的整数倍这样对不满足卷积核大小的部分数据就不会忽略了。通过padding参数指定填充区域的高度和宽度默认0就是填充区域为0不填充的意思dilation卷积核之间的空格默认1。groups将输入数据分组通常不用管这个参数没有太大意义。 代码: import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as Farange(16)
x Variable(torch.Tensor(a))a: range(0, 16)
x: tensor([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13.,14., 15.])
xx.view(1,1,16)x variable: tensor([[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15.]]])
btorch.ones(3)
b[0]0.1
b[1]0.2
b[2]0.3
weights Variable(b)
weightsweights.view(1,1,3)weights: tensor([[[0.1000, 0.2000, 0.3000]]])
yF.conv1d(x, weights, padding0)y: tensor([[[0.8000, 1.4000, 2.0000, 2.6000, 3.2000, 3.8000, 4.4000, 5.0000, 5.6000, 6.2000, 6.8000, 7.4000, 8.0000, 8.6000]]])nn.conv2d 函数定义 nn.Conv2d(self, in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue))参数 in_channel: 输入数据的通道数例RGB图片通道数为3out_channel: 输出数据的通道数这个根据模型调整kennel_size: 卷积核大小可以是int或tuplekennel_size2,意味着卷积大小(2,2) kennel_size2,3意味着卷积大小23即非正方形卷积stride步长默认为1与kennel_size类似stride2,意味着步长上下左右扫描皆为2 stride2,3左右扫描步长为2上下为3 padding 零填充 代码 import torch
import torch.nn as nn
from torch.autograd import Variabler torch.randn(5, 8, 10, 5) # batch, channel , height , width
print(r.shape)r2 nn.Conv2d(8, 14, (3, 2), (2,1)) # in_channel, out_channel ,kennel_size,stride
print(r2)r3 r2(r)
print(r3.shape)torch.Size([5, 8, 10, 5])
Conv2d(8, 14, kernel_size(3, 2), stride(2, 1))
torch.Size([5, 14, 4, 4]) 深度可分离卷积 论文《Xception: Deep Learning with Depthwise Separable Convolutions》 代码API 逐深度卷积 不同于原始卷积深度卷积是一个卷积核负责一个通道独立地在每个通道上进行空间卷积。因此深度卷积的输出特征图数量等于输入特征图数量无法进行有效的维度扩展。 逐点卷积 由于一个特征图仅被一个滤波器卷积无法有效的利用不同通道在相同空间位置上的特征信息由此加入了逐点卷积。点卷积主要是要1×1卷积构成负责将深度卷积的输出按通道投影到一个新的特征图上。 重复多次1x1的卷积操作如下图为128次则最后便会得到一个深度的卷积结果。 代码实现 class DeepWise_PointWise_Conv(nn.Module):def __init__(self, in_ch, out_ch):super(DeepWise_PointWise_Conv, self).__init__()# 深度卷积层Depthwise Convolutionself.depth_conv nn.Conv2d(in_channelsin_ch, # 输入通道数out_channelsin_ch, # 输出通道数每个输入通道对应一个输出通道kernel_size3, # 卷积核大小这里是3x3的深度卷积核stride1, # 步长padding1, # 填充groupsin_ch # 输入通道数等于组数每个输入通道分配一个卷积核)# 点卷积层Pointwise Convolutionself.point_conv nn.Conv2d(in_channelsin_ch, # 输入通道数这里等于深度卷积层的输出通道数out_channelsout_ch, # 输出通道数决定了最终的特征图数量kernel_size1, # 卷积核大小为1x1即点卷积stride1, # 步长padding0, # 无填充groups1 # 输入通道数等于组数每个输入通道独享一个卷积核)def forward(self, input):# 深度卷积out self.depth_conv(input)# 点卷积out self.point_conv(out)return out#将普通卷积替换成深度可分离卷积
nn.Conv2d(32,128,kernal_size3,stride1,padding1)DepthWiseConv(32,128)