热门搜索:和平精英 原神 街篮2 

您的位置:首页 > > 教程攻略 > ai资讯 >你了解了这些背景知识,CNN卷积神经网络就好理解了!

你了解了这些背景知识,CNN卷积神经网络就好理解了!

来源:互联网 更新时间:2026-07-30 13:50

CNN,全称是卷积神经网络(Convolutional Neural Network),字面上看,就是专门为处理像图片这种网格结构数据设计的深度学习算法。眼下最经典的应用场景,就是图像识别和处理——数据以2D网格的形式存在,而CNN通过卷积层、池化层和全连接层的组合,自动且高效地提取特征,完成分类、检测这类任务。

这是CNN的标准定义,但客观地说,“卷积神经网络”这个翻译本身就提升了理解门槛。如果把它解释为“盘旋神经网络”,可能更直观一些。结合下面这张动图,就能彻底搞明白:本质上,就是用卷积核(也叫过滤器或矩阵),像盘旋一样,依次从左到右、从上到下,和输入数据做加减乘除运算。

CNN的由来

CNN的基础理念,其实可以追溯到上世纪60年代。Hubel和Wiesel在研究猫的视觉皮层时发现,其中存在专门对光斑、边缘这类简单模式敏感的神经元。这个发现为后来的CNN埋下了最初的种子。

基于这个发现,1980年Fukushima提出了Neocognitron——一种层次化的无监督学习网络,这可以看作是现代CNN的雏形。1998年,Yann LeCun正式提出了CNN,目的就是为了解决传统全连接网络在处理图像时的短板。

图像数据有个天然特点:相邻像素在空间上是相连的,携带着相似的局部特征。比如,一个像素和它周围的像素,很可能同属某条边缘或某个物体。传统全连接网络把图像直接展平成一维向量,这就丢掉了像素之间的空间邻近性,也破坏了局部连续性,更别提利用图像的平移不变性了。

举个例子,想识别图片里有没有猫。你希望猫在左边还是在右边,都能被认出来吧?但全连接网络很难做到这一点,因为它把图像拉成了长条,像素之间的相对位置信息全没了。

CNN的网络结构大致如此,接下来,拆解几个理解CNN必须搞明白的核心概念。

什么是卷积核

卷积核是CNN里最核心的组件,专门用来提取特征。每个卷积核包含一组可学习的权重,通过在输入数据上滑动——也就是前面说的“盘旋”操作——来生成特征图(feature map),从而捕获空间和模式信息。

每个卷积核只跟输入图像的一小块区域(局部感知域)打交道,这样神经元就不用一次处理整个图像,只专注于一小块。这种机制让卷积核能捕捉到边缘、角点、纹理这些局部特征。而权重共享呢,就是同一个卷积核在整个输入图像上滑动时,用的是同一组权重。这不仅大幅减少了参数量、提升了训练效率,更重要的是,一旦卷积核学会了在图像某处识别某个特征,它就能在图像的任何其他地方识别出同样的特征——这就是平移不变性,也是CNN特别适合处理图像的关键原因。

核的大小也很有讲究。

小核尺寸(比如1×1、3×3)擅长捕捉细粒度特征,对局部信息特别敏感。3×3的核尤其受欢迎,因为它在提取特征和计算效率之间找到了很好的平衡。多个3×3卷积层堆叠起来,可以加深网络,而不会让参数量暴涨。

大核尺寸(比如5×5、7×7)能捕捉更广泛的空间信息,但参数多、计算量大,也更容易过拟合。实践中,3×3核是很多现代CNN架构的默认选择。

卷积核是如何跟输入做计算的,为什么要做Padding?

卷积运算说白了就是:卷积核在输入数据上滑动,对覆盖的局部区域做元素级别的加权求和——就是小学学的四则运算,然后输出一个新的特征图。比如下面这个例子,假设输入是二维矩阵,卷积核也是二维的,卷积核按步长滑动,在每个位置把核与对应区域做乘法再求和,就得到一个像素值。

或者这么理解:卷积核是一个3×3的矩阵,覆盖在输入数据上,两片“九宫格”重叠在一起,对应位置做乘法,再全部加起来,输出到一个新位置。

那为什么要做padding?三个核心原因。

第一,提升边缘数据特征信号的有效性。

注意看卷积过程就会发现,边缘数据参与卷积的次数远少于中间区域。对于图像识别、边缘检测这类任务,边缘信息很重要,不做padding的话,这些信息在深层网络里会逐渐消失。

第二,支持深层次的网络结构。

深层网络需要多次卷积,每次卷积都会缩小特征图尺寸,不做padding的话,特征图很快小到无法继续。用padding保持尺寸不变,就能构建更深的网络。

第三,便于后续特征融合

——这点展开说就长了,以后讲到文生图和Unet时再细聊。想了解Unet的话,可以在文章底部留言,超过10人留言就优先安排。

那具体怎么做Padding?通用的做法就是在原始输入数据的外围扩展出一圈“边缘”,让卷积核能从边缘处开始计算。padding和计算过程可以看下面这个动图。

什么是下采样,池化又是什么意思?

下采样和池化,这两个概念经常一起出现,但稍有区别。

下采样是减少数据维度和复杂度的过程,目的是降低后续层的计算压力,同时尽量保留重要信息。方法包括调整卷积核步长(比如从1步改成2步),以及池化操作。

池化是下采样的一种特殊形式,专门用在深度学习中,通过对特征图邻近区域做聚合来减小尺寸。最常见的是最大池化和平均池化。

为什么引入池化?因为在图像里,一旦一个特征被检测到,它的确切位置就不再像特征本身那么重要。池化能让CNN对特征的存在更敏感,同时对平移等小变化保持一定的不变性,还能减少计算量和过拟合风险。

pooling被翻译成“池化”,还是有点故弄玄虚。本质就是在指定区域内提取最显著的特征,比如最大池化,就是在一个小区域里找最大值。这样做的好处是:如果图像有轻微平移,只要特征还在这个区域内,提取到的最大值就一样——这也是平移不变性的一种体现。

什么是Dropout,它有什么作用?

Dropout是一种很实用的正则化技巧,由Srivasta va等人在2014年提出。核心思想很简单:训练时,随机丢弃一部分神经元(和它们的连接),让网络不过度依赖某些特定节点,从而防止过拟合。

通常dropout率设为0.5,也就是每次训练有一半的神经元随机消失。只在训练阶段启用dropout,测试或评估时关掉它,用全部神经元做决策。

如何用PyTorch实现CNN?

最后,用PyTorch搭一个简单的CNN试试看。

网络架构:

  1. 第一个卷积层:使用32个3×3的卷积核,步长为1,激活函数为ReLU。
  2. 第一个池化层:使用2×2的最大池化。
  3. 第二个卷积层:使用64个3×3的卷积核,步长为1,激活函数为ReLU。
  4. 第二个池化层:使用2×2的最大池化。
  5. 一个全连接层:将前一层的输出平坦化后,连接到一个具有128个神经元的全连接层,激活函数为ReLU。
  6. 输出层:一个具有10个神经元的全连接层,对应于10个类别的输出,使用Softmax作为激活函数。
import torch
import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(7*7*64, 128)
        self.fc2 = nn.Linear(128, 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, 7*7*64)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

# 实例化模型
model = SimpleCNN()
print(model)
关于宇宙的好的网名有哪些
关于宇宙的好的网名有哪些

类型:角色扮演

大小:1

语言:简体中文

平台:互联网

游戏下载

热门手游

手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc