刚做的网站怎么才能搜索到,湖北工程公司建设公司网站,网络营销具有哪些优势和吸引力,全球邮企业邮箱登录入口1、引言#xff08;卷积概念#xff09; 在介绍CNN中卷积概念之前#xff0c;先介绍一个数字图像中“边缘检测edge detection”案例#xff0c;以加深对卷积的认识。图中为大小8X8的灰度图片#xff0c;图片中数值表示该像素的灰度值。像素值越大#xff0c;颜色越亮卷积概念 在介绍CNN中卷积概念之前先介绍一个数字图像中“边缘检测edge detection”案例以加深对卷积的认识。图中为大小8X8的灰度图片图片中数值表示该像素的灰度值。像素值越大颜色越亮所以为了示意我们把右边小像素的地方画成深色图的中间两个颜色的分界线就是我们要检测的边界。 该怎么检测边界呢我们可以设计这样的一个 滤波器filter也称为kernel大小3×3 然后我们用这个filter往我们的图片上“盖”覆盖一块跟filter一样大的区域之后对应元素相乘然后求和。计算一个区域之后就向其他区域挪动接着计算直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积”。 我们不用管卷积在数学上到底是指什么运算我们只用知道在CNN中是怎么计算的。 这里的“挪动”就涉及到一个步长假如我们的步长是1那么覆盖了一个地方之后就挪一格容易知道总共可以覆盖6×6个不同的区域。 通过上述操作发现边界被准确探测出。 卷积神经网络CNN中的卷积就是通过一个个的filter不断地提取特征从局部的特征到总体的特征从而进行图像识别等等功能。 那么问题来了我们怎么可能去设计这么多各种各样的filter首先我们都不一定清楚对于一大堆图片我们需要识别哪些特征其次就算知道了有哪些特征想真的去设计出对应的filter恐怕也并非易事要知道特征的数量可能是成千上万的。 其实学过神经网络之后我们就知道这些filter根本就不用我们去设计每个filter中的各个数字不就是参数吗我们可以通过大量的数据来让机器自己去“学习”这些参数嘛。这就是CNN的原理。
2、CNN基本概念 在理解CNN中卷积概念后有一些基本概念需要理解包括padding填白、stride步长、pooling池化、对多通道图片卷积。
2.1 padding填白 从上面的引子中我们可以知道原图像在经过filter卷积之后变小了从(88)变成了(66)。假设我们再卷一次那大小就变成了(44)了。 这样有啥问题呢 主要有两个问题 每次卷积图像都缩小这样卷不了几次就没了 相比于图片中间的点图片边缘的点在卷积中被计算的次数很少。这样的话边缘的信息就易于丢失。 为了解决这个问题我们可以采用padding的方法。我们每次卷积前先给图片周围都补一圈空白让卷积之后图片跟原来一样大同时原来的边缘也被计算了更多次。 比如我们把(88)的图片给补成(1010)那么经过(33)的filter之后就是(88)没有变。 我们把上面这种“让卷积之后的大小不变”的padding方式称为 “Same”方式 把不经过任何填白的称为 “Valid”方式。这个是我们在使用一些框架的时候需要设置的超参数。
2.2 stride步长 前面我们所介绍的卷积都是默认步长是1但实际上我们可以设置步长为其他的值。 比如对于(88)的输入我们用(33)的filter 如果stride1则输出为(66); 如果stride2则输出为(33)。 举栗子
栗子1stride1padding0遍历采样无填充padding‘valid’栗子2stride1padding1遍历采样有填充padding‘same’栗子3stride2padding0降采样无填充尺寸缩小二点五分之一栗子4stride2padding1降采样有填充尺寸缩小二分之一 Stride的作用是成倍缩小尺寸而这个参数的值就是缩小的具体倍数比如步幅为2输出就是输入的1/2步幅为3输出就是输入的1/3。 栗子1 一个特征图尺寸为4*4的输入使用3*3的卷积核步幅1填充0输出的尺寸(4 - 3)/1 1 2 栗子2 一个特征图尺寸为5*5的输入使用3*3的卷积核步幅1填充1输出的尺寸(5 2*1 - 3)/1 1 5 栗子3 一个特征图尺寸为5*5的输入 使用3*3的卷积核步幅2填充0输出的尺寸(5-3)/2 1 2栗子4 一个特征图尺寸为6*6的输入 使用3*3的卷积核步幅2填充1输出的尺寸(6 2*1 - 3)/2 1 2.5 1 3.5 向下取整3降采样边长减少1/2 在PyTorch中卷积层的步幅stride也是一个一维张量通常包含两个或四个元素具体取决于卷积层的类型2D或3D卷积。对于2D卷积层步幅通常是一个包含两个元素的张量格式为 [stride_height, stride_width]。对于3D卷积或其他更复杂的层步幅可能包含四个元素格式为 [stride_batch, stride_height, stride_width, stride_channel]但这种情况较少见因为通常不会在批处理维度或通道维度上应用步幅。
import torch.nn as nn# 定义一个2D卷积层步幅为(2, 2)
conv_layer nn.Conv2d(in_channels3, out_channels64, kernel_size3, stride(2, 2), padding1) 在这个例子中stride(2, 2) 表示卷积核在高度和宽度方向上每次移动两个像素。这种设置通常用于减少特征图的尺寸实现下采样。 2.3 pooling池化 这个pooling是为了提取一定区域的主要特征并减少参数数量防止模型过拟合。 比如下面的MaxPooling采用了一个2×2的窗口并取stride2 除了MaxPooling,还有AveragePooling顾名思义就是取那个区域的平均值。
2.4 对多通道channels图片的卷积 这个需要单独提一下。彩色图像一般都是RGB三个通道channel的因此输入数据的维度一般有三个长宽通道。 比如一个28×28的RGB图片维度就是(28283)。 前面的引子中输入图片是2维的(88)filter是(33)输出也是2维的(66)。 如果输入图片是三维的呢即增多了一个channels比如是(883)这个时候我们的filter的维度就要变成(333)了它的最后一维要跟输入的channel维度一致。 这个时候的卷积是三个channel的所有元素对应相乘后求和也就是之前是9个乘积的和现在是27个乘积的和。因此输出的维度并不会变化。还是(66)。 但是一般情况下我们会 使用多个filters同时卷积比如如果我们同时使用4个filter的话那么 输出的维度则会变为(664)。 图中的输入图像是(883)filter有4个大小均为(333)得到的输出为(664)。
其实如果套用我们前面学过的神经网络的符号来看待CNN的话
我们的输入图片就是Xshape(883)4个filters其实就是第一层神金网络的参数W1shape(3334),这个4是指有4个filters;我们的输出就是Z1shape(664)后面其实还应该有一个激活函数比如relu经过激活后Z1变为A1shape(664)
所以在前面的图中我加一个激活函数给对应的部分标上符号就是这样的 在pytorch中自定义卷积层代码如下 self.conv2 nn.Sequential(nn.Conv2d(in_channels16, out_channels32, kernel_size3, stride1, padding1),nn.ReLU(),nn.MaxPool2d(kernel_size2, stride2),) 卷积层 (nn.Conv2d): in_channels16: 输入通道数这里是16意味着这个卷积层期望接收具有16个通道的输入数据。out_channels32: 输出通道数设置为32表示这个卷积层会产生32个特征图filters/feature maps。kernel_size3: 卷积核的大小是3x3像素。stride1: 步长为1表示卷积核每次移动一个像素。padding1: 填充为1表示在输入数据的周围添加一圈0值填充使得卷积操作后输出的空间维度与输入相同。 激活层 (nn.ReLU): 应用ReLURectified Linear Unit激活函数它将每个输入值转换为最大值0和输入值本身。这有助于引入非线性使得网络能够学习更复杂的特征。 池化层 (nn.MaxPool2d): kernel_size2: 池化窗口的大小是2x2像素。stride2: 步长为2表示池化窗口每次移动两个像素。这通常会导致输出特征图的空间尺寸减半。
3、CNN的结构组成 上面我们已经知道了卷积convolution、池化pooling以及填白padding是怎么进行的接下来我们就来看看CNN的整体结构它包含了3种层layer
3.1 卷积层Convolutional layer, conv 由滤波器filters和激活函数构成。 一般要设置的超参数包括filters的数量、大小、步长以及padding是“valid”还是“same”。当然还包括选择什么激活函数。
3.2 Pooling layer池化层-pool 这里里面没有参数需要我们学习因为这里里面的参数都是我们设置好了要么是Maxpooling要么是Averagepooling。 需要指定的超参数包括是Max还是average窗口大小以及步长。 通常我们使用的比较多的是Maxpooling,而且一般取大小为(22)步长为2的filter这样经过pooling之后输入的长宽都会缩小2倍channels不变。
3.3 Fully Connected layer全链接层-FC 全连接层Fully Connected Layer也称为密集层Dense Layer是神经网络中的一层其中每个神经元都与前一层的所有神经元相连接。全连接层通常用于神经网络的最后几层将学到的特征映射到最终的输出例如分类任务的类别数。 在全连接层中每个神经元都有一组参数权重和偏置这些参数用于对输入数据进行线性变换然后通过激活函数进行非线性变换。全连接层的输出是输入数据和权重矩阵的线性组合再加上偏置向量。 参考博客
【1】多通道图片的卷积_多通道卷积过程-CSDN博客
【2】CNN中stride步幅和padding填充的详细理解_cnn stride-CSDN博客