php网站建设公司,喜迎二十大,网站建设承揽合同,网站建设管理 自查 报告目录
前言
一、卷积神经网络概述
二、卷积神经网络特点
卷积运算
单通道#xff0c;二维卷积运算示例
单通道#xff0c;二维#xff0c;带偏置的卷积示例
带填充的单通道#xff0c;二维卷积运算示例
Valid卷积
Same卷积
多通道卷积计算
1.局部感知域
2.参数共…目录
前言
一、卷积神经网络概述
二、卷积神经网络特点
卷积运算
单通道二维卷积运算示例
单通道二维带偏置的卷积示例
带填充的单通道二维卷积运算示例
Valid卷积
Same卷积
多通道卷积计算
1.局部感知域
2.参数共享
3.池化层
4.层次化提取 三、卷积网络组成结构 前言
PyTorch可以说是三大主流框架中最适合初学者学习的了相较于其他主流框架PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是框架可以类比为编程语言仅为我们实现项目效果的工具也就是我们造车使用的轮子我们重点需要的是理解如何使用Torch去实现功能而不要过度在意轮子是要怎么做出来的那样会牵扯我们太多学习时间。以后就出一系列专门细解深度学习框架的文章但是那是较后期我们对深度学习的理论知识和实践操作都比较熟悉才好开始学习现阶段我们最需要的是学会如何使用这些工具。
深度学习的内容不是那么好掌握的包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化转换为我们比较熟悉的内容我将尽力让大家了解并熟悉神经网络框架保证能够理解通畅以及推演顺利的条件之下尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法以效率最高的方式熟练这些知识。 博主专注数据建模四年参与过大大小小数十来次数学建模理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏:一文速学-数学建模常用模型https://blog.csdn.net/master_hunter/category_10967944.html 一、卷积神经网络概述
卷积神经网络Convolutional Neural Network简称CNN是一种特殊的人工神经网络结构它在图像识别、语音识别、自然语言处理等领域有着广泛的应用。CNN的特点在于其能够自动提取输入数据的特征从而实现对输入数据的高效分类和识别。根据专栏阅读而到此部分的读者对神经网络基础都有很清晰的了解普通的神经网络架构的基本功能还是存在很多可以优化的点。而卷积神经网络是一类包含卷积运算且具有深度结构的前馈神经网络这里我们划重点卷积运算和深度结果前馈神经网络也就是具有前向传播没有循环和记忆功能的单向网络。那么只要认识到卷积运算和卷积神经网络的特殊性质就可以很好的区分普通前馈神经网络和卷积神经网络。
二、卷积神经网络特点 卷积神经网络相对于普通神经网络在于以下四个特点
局部感知域CNN的神经元只与输入数据的一小部分区域相连接这使得CNN对数据的局部结构具有强大的敏感性可以自动学习到图像的特征。参数共享在CNN中同一个卷积核filter在整个输入图像上滑动共享权重和偏置。这减少了网络的参数量提高了模型的泛化能力。池化层通过池化层CNN可以降低特征图的分辨率减少计算量同时保留主要的特征信息提高了网络的抗噪能力和泛化能力。层次化特征提取通过堆叠多层卷积层和池化层网络可以逐级提取图像的抽象特征从低级特征如边缘到高级特征如纹理、形状等。
卷积运算
我们以多个实例来理解卷积运算
单通道二维卷积运算示例 红色的方框圈中的数字和卷积核乘积再相加得到输出数据。
单通道二维带偏置的卷积示例 带偏置的计算是在上述乘积运算之后加上偏置。
带填充的单通道二维卷积运算示例 对于以上实例填充边缘为0的向量是因为在标准的卷积过程中存在两个问题
每次卷积运算后图像就会缩小在经历多次运算后图像终会失去其形状变为 的 “柱状”。
对于图像边缘的像素其只被一个输出所触碰或者使用但对于图像中间的像素则会有多个卷积核与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少意味着卷积过程丢掉了图像边缘位置的许多信息。
对于这个问题可以采用额外的 “假” 像素通常值为 0 因此经常使用的术语 ”零填充“ 填充边缘。这样在滑动时的卷积核可以允许原始边缘像素位于其中心同时延伸到边缘之外的假像素。假设填充的像素大小为 则 就变成了 故其输出图像的尺寸为 。至于选择填充多少像素通常有两个选择分别叫做 Valid 卷积和 Same 卷积。
Valid卷积
Valid 卷积意味着不填充如之前所述图像会经历卷积运算后逐渐缩小输出的图像尺寸即为上述公式。
Same卷积
Same卷积意味填充后输出图像的尺寸与输入图像的尺寸相同根据上述公式令 可得到。当 时。一般卷积核 的大小会选择一个奇数如 3 \ 5 \ 7 等。主要因为
如果 是一个偶数那么只能使用一些不对称填充。只有当 是奇数时Same 卷积才会有自然的填充即可以选择同样的数量填充四周。当卷积核 是奇数时其只有一个中心点在具体的程序实现过程中会便于指出卷积核的位置。 多通道卷积计算
多通道卷积会按通道进行输入数据和滤波器的卷积运算并将结果相加 从而得到输出 以上篇文章卷积神经网络对Cifar10图像的分类卷积运算的过程整体网络计算架构为 原图像尺寸为分别和个的卷积核(又名滤波器,filiter)进行卷积运算得到个的特征图feature map每个特征图分别添加不同的偏置bias具体为特征图中的每个元素 对每个特征图添加激活函数 进行非线性运算将这 个特征图依次叠加得到最终的特征图尺寸为 。
1.局部感知域
局部感知域指的是网络中的每一个神经元只对输入数据的一个局部区域进行感知而不是整个输入数据。 在卷积神经网络中每个神经元的权重是共享的。这意味着在处理不同的输入位置时使用的权重是相同的。这种权重共享使得网络对于平移不变性具有很强的适应能力。卷积操作只关注输入数据的局部区域而非整个输入数据。这样可以减少网络的参数数量降低计算复杂度。由于权重共享和稀疏连接的特性卷积神经网络能够高效地处理大规模的输入数据如高分辨率图像。通过卷积操作网络可以逐步提取输入数据的局部特征从低层到高层逐步抽象和组合特征形成对于整体特征的理解。
2.参数共享
卷积神经网络Convolutional Neural NetworkCNN的参数共享是指在网络的不同位置使用相同的参数权重和偏置来处理输入数据的不同区域这是卷积层的一个重要特点。
具体来说卷积操作在处理输入数据时会使用一个称为卷积核filter的小窗口通过与输入数据的局部区域进行卷积运算来提取特征。而在整个输入数据上使用的卷积核是相同的。这意味着网络的不同位置使用的权重是共享的。
这种参数共享有以下几个重要特点
减少参数数量由于同一个卷积核在不同位置共享网络的参数数量大大减少。这降低了模型的复杂度减少了过拟合的可能性。
增强模型的平移不变性由于同一特征的卷积核在不同位置使用相同的权重使得模型对输入数据的平移具有不变性从而能够更好地处理平移变换后的数据。
提高计算效率参数共享减少了计算量因为不同位置使用相同的权重进行计算避免了重复计算。
# 定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()# 定义一个卷积层使用3个3x3的卷积核self.conv nn.Conv2d(in_channels1, out_channels3, kernel_size3)def forward(self, x):# 使用卷积操作处理输入数据x self.conv(x)return x self.conv 是一个卷积层它使用了3个3x3的卷积核进行卷积操作。无论输入数据的哪一个位置这3个卷积核的参数都是相同的。
3.池化层
对于 的特征图其池化过程仅需通过池化核对该特征图进行池化运算即可得到输出。 在通过卷积获得了特征 (features) 之后下一步我们希望利用这些特征去做分类。理论上讲人们可以用所有提取得到的特征去训练分类器但这样做会面临巨大计算量的挑战。并且容易出现过拟合 (over-fitting)。
池化层通过对特征图进行降维减少了后续层的计算量同时保留了重要的特征。卷积后的特征具有一种“静态性”的属性意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。也就是说一张图片有多只鸟在一个区域提取的鸟图像的特征在该图像的另一端鸟图像的特征也同样适用。与卷积层类似池化操作也使用一个移动的窗口但它的操作是简单的统计汇总如最大值或平均值。这些统计到的特征不仅具有低得多的维度 (相比使用所有提取得到的特征)同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling)。
import torch
import torch.nn as nn# 定义一个示例的特征图假设通道数为3高度为4宽度为4
feature_map torch.randn(1, 3, 4, 4) # 1表示batch size# 定义一个最大池化层窗口大小为2x2步幅为2
max_pooling_layer nn.MaxPool2d(kernel_size2, stride2)# 应用最大池化层
output max_pooling_layer(feature_map)# 输出的尺寸会缩小一半因为窗口大小为2x2步幅为2
print(output.shape)这样需要注意的是池化操作是对每个通道分别进行的不会改变通道的数量。池化层对于一定程度的平移、旋转、缩放等变化保持不变性即使特征稍微移动也能被正确检测到减少了特征图的维度也减少了模型的参数数量有助于减轻过拟合的问题。
4.层次化提取
根据以上的图例很容易明白CNN的的计算层次化CNN 由多个卷积层和池化层组成每一层都可以提取出不同层次的特征。前层主要提取低级特征如边缘、纹理等后层逐渐提取高级抽象的特征如形状、对象等。每一层的特征都是基于前一层的特征提取的这样多层的叠加使得网络能够提取出更加复杂的特征。随着层次的增加特征图的尺寸逐渐缩小这减少了后续层的计算量。 三、卷积网络组成结构 卷积神经网络Convolutional Neural NetworkCNN的基本架构通常包括以下几种层
输入层Input Layer接受原始数据输入例如图像其尺寸与输入图像的尺寸相匹配。
卷积层Convolutional Layer负责特征提取。卷积核在输入数据上滑动计算每个位置的卷积从而得到特征图。多个卷积核可以提取多种特征。通常会使用ReLU等激活函数来引入非线性。
池化层Pooling Layer减小特征图的尺寸同时保留最重要的信息。常用的池化操作是最大池化和平均池化。
全连接层Fully Connected Layer将之前层次提取的特征进行扁平化并通过全连接操作将其与输出层相连接。
输出层Output Layer根据任务的不同可以是一个全连接层也可以是一个Softmax层用于分类问题。
批归一化层Batch Normalization Layer用于加速训练过程提升模型的泛化性能。
Dropout层在训练过程中随机断开一部分神经元防止过拟合。
残差连接Residual Connection引入跳跃连接可以在深层网络中减轻梯度消失问题。
卷积核Kernel卷积操作的核心部分可以将其视为特征检测器。 一个简单的卷积神经网络示例
import torch
import torch.nn as nnclass SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 nn.Conv2d(in_channels3, out_channels16, kernel_size3, stride1, padding1)self.pool nn.MaxPool2d(kernel_size2, stride2, padding0)self.conv2 nn.Conv2d(in_channels16, out_channels32, kernel_size3, stride1, padding1)self.fc1 nn.Linear(32 * 16 * 16, 512)self.fc2 nn.Linear(512, 10)def forward(self, x):x self.pool(F.relu(self.conv1(x)))x self.pool(F.relu(self.conv2(x)))x x.view(-1, 32 * 16 * 16)x F.relu(self.fc1(x))x self.fc2(x)return x# 创建网络实例
net SimpleCNN()# 打印网络结构
print(net)其中包含两个卷积层、两个池化层和两个全连接层。
具体案例参考PyTorch实战实现Cifar10彩色图片分类