卷积神经网络(Convolutional Neural Networks, CNN)

[复制链接]
发表于 2026-1-15 01:26:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
卷积神经网络(Convolutional Neural Networks, CNN)是深度学习范畴中用于处理惩罚具有网格结构的输入(如图像和视频)的神经网络模子。下面以最简朴、直观的方式概述CNN的重要流程及其根本概念:
1. 输入层


  •         概念:输入层直接吸取原始数据,比如一张图片,通常是一张二维或三维的矩阵,包罗像素信息。
  •         流程:比方,输入一张28x28像素的灰度图像,形成一个28x28的矩阵,每个元素代表一个像素的亮度值。
2. 卷积层


  •         概念:卷积层通过卷积核(或称滤波器)扫描输入数据,辨认特定的特性。卷积核是一个小的矩阵,它会与输入数据的局部地区做元素相乘再求和的操纵。
  •         流程:一个3x3的卷积核在输入图像上滑动,每次覆盖9个像素,盘算一个值,如许就形成了一个“特性图”,可以或许捕捉图像中的根本特性,如边沿、纹理等。
3. 激活函数


  •         概念:激活函数引入了非线性变更,使得网络可以或许学习更复杂的模式。
  •         流程:通常在卷积操纵后应用,如ReLU(Rectified Linear Unit),它会将全部负值置为0,生存和放大正值,增强网络的表达本领。
4. 池化层


  •         概念:池化层用于低落数据的维度,同时生存紧张信息,增强模子对位置稍微变革的鲁棒性。
  •         流程:常见的有最大池化(取局部地区的最大值)和匀称池化(取局部地区的匀称值),通常利用2x2的窗口,步长为2,将特性图的尺寸减半。
5. 全毗连层


  •         概念:全毗连层毗连全部神经元,用于整合全部特性,做出终极的分类或回归推测。
  •         流程:将卷积和池化后的多维特性图展平为一维向量,通过权重矩阵映射到分类标签的空间,输出每个种别的概率。
6. 输出层


  •         概念:输出层给出终极的分类决议或回归结果。
  •         流程:在分类任务中,通常通过softmax函数将全毗连层的输出转换为概率分布,推测概率最高的种别为最闭幕果。
整个过程可以概括为:原始图像输入 → 卷积提取特性 → 激活非线性变更 → 池化降维 → 全毗连层整合特性 → 输出层给出推测结果。
通过多层的卷积和池化处理惩罚,CNN可以或许从原始像素中主动学习和提取多条理的特性,终极用于辨认和分类。
  1. class CNN(nn.Module):
  2.     def __init__(self):
  3.         super(CNN, self).__init__()
  4.         self.conv1 = nn.Sequential(         # 输入大小 (1, 28, 28)
  5.             nn.Conv2d(
  6.                 in_channels=1,              # 灰度图
  7.                 out_channels=16,            # 要得到几 多少个特征图
  8.                 kernel_size=5,              # 卷积核大小
  9.                 stride=1,                   # 步长
  10.                 padding=2,                  # 如果希望卷积后大小跟原来一样,需要设置padding=(kernel_size-1)/2 if stride=1
  11.             ),                              # 输出的特征图为 (16, 28, 28)
  12.             nn.ReLU(),                      # relu层
  13.             nn.MaxPool2d(kernel_size=2),    # 进行池化操作(2x2 区域), 输出结果为: (16, 14, 14)
  14.         )
  15.         self.conv2 = nn.Sequential(         # 下一个套餐的输入 (16, 14, 14)
  16.             nn.Conv2d(16, 32, 5, 1, 2),     # 输出 (32, 14, 14)
  17.             nn.ReLU(),                      # relu层
  18.             nn.Conv2d(32, 32, 5, 1, 2),
  19.             nn.ReLU(),
  20.             nn.MaxPool2d(2),                # 输出 (32, 7, 7)
  21.         )
  22.         
  23.         self.conv3 = nn.Sequential(         # 下一个套餐的输入 (16, 14, 14)
  24.             nn.Conv2d(32, 64, 5, 1, 2),     # 输出 (32, 14, 14)
  25.             nn.ReLU(),             # 输出 (32, 7, 7)
  26.         )
  27.         
  28.         self.out = nn.Linear(64 * 7 * 7, 10)   # 全连接层得到的结果
  29.     def forward(self, x):
  30.         x = self.conv1(x)
  31.         x = self.conv2(x)
  32.         x = self.conv3(x)
  33.         x = x.view(x.size(0), -1)           # flatten操作,结果为:(batch_size, 32 * 7 * 7)
  34.         output = self.out(x)
  35.         return output
复制代码
1. 再到场一层卷积,结果怎么样?

在神经网络中,增长一层卷积层通常可以增强模子的表征本领,使其可以或许学习到更复杂的特性。但是,这同样会增长模子的复杂度,大概导致模子练习时间变长,以及在数据量不敷时容易发生过拟合。详细结果怎样,必要通过实验验证。
比方,假如原模子有一层卷积层,你可以实验在厥后增长另一层卷积层,同时思量利用更小的滤波器(比方 3x3)和符合的步长与添补,以保持输出尺寸稳固。增长的卷积层可以利用ReLU激活函数,以保持非线性。
  1. conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1)
  2. conv2 = nn.Conv2d(out_channels, out_channels_next, kernel_size=3, stride=1, padding=1)
复制代码
在实际操纵中,必要监控监控模子的练习和验证集性能,确保增长的复杂性带来了实际的性能提升。
2. 当前任务中为什么全毗连层是3277?每一个数字代表什么寄义?

在卷积神经网络中,全毗连层前的尺寸通常反映了特性图的巨细和深度。3277中的每个数字有其特定寄义:

  •         32:代表特性图的深度(也就是上一层输出的通道数)。这通常是指在卷积层或池化层后,模子学习到的特性的数量。每个通道可以看作是模子学习到的某种特定特性的相应。
  •         77:表现特性图的宽度和高度。这是颠末一系列卷积和池化操纵后,原始输入图像被降采样(或下采样)后的尺寸。
以范例的CNN架构为例,假设输入图像为224x224像素,利用一个7x7的卷积核,颠末两次最大池化(每次池化核巨细为2x2,步长为2),特性图的尺寸会从224x224降为56x56,再降为28x28,末了到14x14。假如在14x14的特性图上再利用卷积层,特性图的深度会增长,但宽度和高度保持稳固,直到末了被展平(flatten)成1D向量送入全毗连层。
因此,假如终极特性图的深度为32,而宽度和高度均为7,展平后的向量长度即为3277,这是在进入全毗连层前,模子对图像特性的终极表征。全毗连层将利用这些特性举行终极的分类决议。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表