当前位置: 首页 > news >正文

初识CNN01——认识CNN


文章目录

  • 一、CNN是什么?
    • 1.1 概念
    • 1.2 卷积思想
  • 二、卷积层
    • 2.1 卷积核
    • 2.2 卷积计算
    • 2.3 padding&stride
    • 2.4 多通道卷积
    • 2.5 特征图大小
    • 2.6 api
  • 三、池化层
    • 3.1 概述
    • 3.2 池化层计算
    • 3.3 多通道池化
    • 3.4 池化层的作用
    • 3.5 API
  • 总结


一、CNN是什么?

1.1 概念

卷积神经网络(Convolutional Neural Network,CNN)是含有卷积层的神经网络. 卷积层的作用就是用来自动学习、提取图像的特征。是一种专门用于处理具有网格状结构数据的深度学习模型。最初,CNN主要应用于计算机视觉任务,但它的成功启发了在其他领域应用,如自然语言处理等。

CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中的局部特征;池化层用来大幅降低运算量并特征增强;全连接层类似神经网络的部分,用来输出想要的结果。

  • 应用场景
领域典型应用代表模型
计算机视觉图像分类、目标检测、语义分割ResNet, YOLO, U-Net
医疗影像肿瘤检测、X光片分析CheXNet
自动驾驶车道线识别、交通标志检测Tesla HydraNet
自然语言处理文本分类、机器翻译(位置特征提取)Char-CNN
人脸识别人脸验证、活体检测FaceNet
  • 全连接的局限性
    全连接神经网络并不太适合处理图像数据,在计算机视觉领域, 往往我们输入的图像都很大,使用全连接网络的话,计算的代价较高。另外全连接神经网络会将图像展开,破坏像素之间的相对位置关系,图像很难保留原有的特征,导致图像处理的准确率不高。
    在这里插入图片描述

  • 与传统网络的区别
    在这里插入图片描述

1.2 卷积思想

  • 概念
    ​ 卷积(Convolution),输入信息与卷积核(滤波器,Filter)的乘积。 卷:从左往右,从上往下;积:乘积,求和。
  • 局部连接
    • 局部连接可以更好地利用图像中的结构信息,空间距离越相近的像素其相互影响越大。
    • 根据局部特征完成目标的可辨识性。
  • 权重共享
    • 图像从一个局部区域学习到的信息应用到其他区域。
    • 减少参数,降低学习难度。

二、卷积层

2.1 卷积核

卷积核是卷积运算过程中必不可少的一个“工具”,在卷积神经网络中,卷积核是非常重要的,它们被用来提取图像中的特征。

卷积核可以看作是一个矩阵,有以下几方面的特征:

  • 卷积核的个数:卷积核(过滤器)的个数决定了其输出特征矩阵的通道数
  • 卷积核的值:卷积核的值是初始化好的,后续进行更新。
  • 卷积核的大小:常见的卷积核有1×1、3×3、5×5等,一般都是奇数 × 奇数。

下图就是一个3×3的卷积核:
在这里插入图片描述

2.2 卷积计算

  • 计算过程
    卷积的过程是将卷积核在图像上进行滑动计算,每次滑动到一个新的位置时,卷积核和图像进行点对点的计算,并将其求和得到一个新的值,然后将这个新的值加入到特征图中,最终得到一个新的特征图。
    在这里插入图片描述
  1. input 表示输入的图像
  2. filter 表示卷积核, 也叫做滤波器
  3. input 经过 filter 的得到输出为最右侧的图像,该图叫做特征图

卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。

具体计算步骤如下:
在这里插入图片描述
左上角的点计算方法:
在这里插入图片描述
按照上面的计算方法可以得到最终的特征图为:
在这里插入图片描述
卷积的重要性在于它可以将图像中的特征与卷积核进行卷积操作,从而提取出图像中的特征。可以通过不断调整卷积核的大小、卷积核的值和卷积操作的步长,可以提取出不同尺度和位置的特征。

卷积计算底层实现并非是水平和垂直方向的循环,其真正的计算过程如下:
在这里插入图片描述

2.3 padding&stride

  • Padding
    通过上面的卷积计算,我们发现最终的特征图比原始图像要小,如果想要保持图像大小不变, 可在原图周围添加padding来实现。更重要的是,边缘填充还更好的保护了图像边缘数据的特征。
    在这里插入图片描述
  • Stride
    按照步长为1来移动卷积核,计算特征图如下所示:
    在这里插入图片描述
    如果我们把 Stride 增大为2,也是可以提取特征图的,如下图所示:
    在这里插入图片描述

stride太小:重复计算较多,计算量大,训练效率降低;
stride太大:会造成信息遗漏,无法有效提炼数据背后的特征;

2.4 多通道卷积

图像在计算机眼中是一个矩阵,通道越多,可以表达的特征就越丰富。
在这里插入图片描述
对于多通道图像的卷积计算方法如下:

  1. 当输入有多个通道(Channel), 例如RGB三通道, 此时要求卷积核需要有相同的通道数。
  2. 卷积核通道与对应的输入图像通道进行卷积。
  3. 将每个通道的卷积结果按位相加得到最终的特征图。
    在这里插入图片描述
    实际对图像进行特征提取时, 我们需要使用多个卷积核进行特征提取。这个多个卷积核可以理解为从不同到的视角、不同的角度对图像特征进行提取。
    在这里插入图片描述
    卷积操作不仅可以对原图像使用还可以对卷积后得到的特征图使用:
    在这里插入图片描述

2.5 特征图大小

输出特征图的大小与以下参数息息相关:

  1. size: 卷积核/过滤器大小,一般会选择为奇数,比如有 1×1, 3×3, 5×5
  2. Padding: 零填充的方式
  3. Stride: 步长

完整的计算公式为:
在这里插入图片描述
dilation参数含义后面会提到,这里先不作解释

可以将公式简化为:
在这里插入图片描述

其中:

  1. 输入图像大小: W x W
  2. 卷积核大小: F x F
  3. Stride: S
  4. Padding: P
  5. 输出图像大小: N x N

以下图为例:

  1. 图像大小: 5 x 5
  2. 卷积核大小: 3 x 3
  3. Stride: 1
  4. Padding: 1
  5. (5 - 3 + 2) / 1 + 1 = 5, 即得到的特征图大小为: 5 x 5
    在这里插入图片描述

2.6 api

官方文档
示例:

from matplotlib import pyplot as plt
import os
import torch
import torch.nn as nncurrent_path = os.path.dirname(__file__)
img_path = os.path.join(current_path, "data", "彩色.png")
# 转换为相对路径
img_path = os.path.relpath(img_path)# 使用plt读取图片
img = plt.imread(img_path)
print(img.shape)
# 转换为张量:HWC  ---> CHW  ---> NCHW  链式调用
img = torch.tensor(img).permute(2, 0, 1).unsqueeze(0)
conv = nn.Conv2d(in_channels=4,  # 输入通道out_channels=16,  # 输出特征,等于输出的通道数kernel_size=3,  # 卷积核大小,影响宽高stride=1,  # 步长,影响宽高padding=0,  # 填充bias=True
)
# 使用卷积核对图像进行卷积操作
out = conv(img)
print(out.shape)
# 输出128个特征图
conv2 = nn.Conv2d(in_channels=32,  # 输入通道out_channels=128,  # 输出通道kernel_size=(5, 5),  # 卷积核大小stride=1,  # 步长padding=0,  # 填充bias=True)
out = conv2(out)
# 把图像显示出来
print(out.shape)
plt.imshow(out[0][10].detach().numpy(), cmap='gray')
plt.show()

三、池化层

3.1 概述

池化层 (Pooling) 降低空间维度, 缩减模型大小,提高计算速度. 即: 主要对卷积层学习到的特征图进行下采样(SubSampling)处理。

池化层主要有两种:

  1. 最大池化 max pooling

    最大池化是从每个局部区域中选择最大值作为池化后的值,这样可以保留局部区域中最显著的特征。最大池化在提取图像中的纹理、形状等方面具有很好的效果。

  2. 平均池化 avgPooling

    平均池化是将局部区域中的值取平均作为池化后的值,这样可以得到整体特征的平均值。平均池化在提取图像中的整体特征、减少噪声等方面具有较好的效果。

3.2 池化层计算

计算方式如下:
在这里插入图片描述
池化计算也有stride和padding参数,原理与卷积核的计算相同。

3.3 多通道池化

在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各个通道的输入相加。这意味着池化层的输出和输入的通道数是相等。

在这里插入图片描述

3.4 池化层的作用

池化操作的优势有:

  1. 通过降低特征图的尺寸,池化层能够减少计算量,从而提升模型的运行效率。
  2. 池化操作可以带来特征的平移、旋转等不变性,这有助于提高模型对输入数据的鲁棒性。
  3. 池化层通常是非线性操作,例如最大值池化,这样可以增强网络的表达能力,进一步提升模型的性能。

但是池化也有缺点:

  1. 池化操作会丢失一些信息,这是它最大的缺点;

3.5 API

官方文档
示例:

input_map=torch.randn(1, 1, 7, 7)
print(input_map)
maxpool=nn.MaxPool2d(kernel_size=3, stride=1, padding=0,return_indices=True
)
out,index=maxpool(input_map)
print(out,index)
meanpool=nn.AvgPool2d(kernel_size=3, stride=1, padding=0,
)
out=meanpool(input_map)
print(out)

总结

本文简要介绍了CNN的基本概念,以及其对比全连接神经网络的优势。以及卷积和池化的基本概念。

http://www.dtcms.com/a/331234.html

相关文章:

  • 计算机组成原理20250814
  • 网络通信---Axios
  • 在线进销存系统高效管理网站源码搭建可二开
  • 考研408《计算机组成原理》复习笔记,第三章(7)——虚拟存储器
  • 考公VS考研,拼哪个性价比高?
  • 什么是域名抢注?域名抢注常见问题汇总
  • 图书商城小程序怎么做?实体书店如何在微信小程序上卖书?
  • 使用vllm运行智谱GLM-4.5V视觉语言模型推理服务
  • 如何使用 AI 大语言模型解决生活中的实际小事情?
  • 数据结构——线性表(链表,力扣简单篇)
  • vscode的wsl环境,ESP32驱动0.96寸oled屏幕
  • 失败存储:查看未成功的内容
  • vscode使用keil5出现变量跳转不了
  • 如何让手机访问本地服务器部署的网页?无公网IP内网主机应用,自定义外网地址,给任意网设备访问
  • 利用 Java 爬虫按图搜索 1688 商品(拍立淘)实战指南
  • 第一章 java基础
  • 手写MyBatis第17弹:ResultSetMetaData揭秘:数据库字段到Java属性的桥梁
  • 《C++》哈希表解析与实现
  • 能源行业数字化转型:边缘计算网关在油田场景的深度应用
  • Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
  • 基于51单片机倒计时器秒表定时器数码管显示设计
  • vue+后端
  • 微服务、分布式概念-以及集群部署 vs 分布式部署
  • 容器运行时支持GPU,并使用1panel安装ollama
  • 将 pdf 转为高清 jpg
  • 数巅中标中建科技AI知识库项目,开启建筑业数智化新篇章
  • CSS aspect-ratio 属性
  • Multimodal RAG Enhanced Visual Description
  • Linux 对 RPM 包的管理
  • 19 ABP Framework 本地化系统