卷积神经网络-从零开始构建一个卷积神经网络

news2025/5/14 21:00:19

目录

一、什么是卷积神经网络CNN

1.1、核心概念

1.2、卷积层

二、什么是卷积计算

2.1、卷积计算的例子:

2.2、点积

2.3、卷积与点积的关系

2.4、Padding(填充)

2.4.1、Padding的主要作用

1、控制输出特征图尺寸

2、保留边缘信息

3. 支持深层网络训练

2.4.2、Stride

2.5、多通道卷积计算

2.6、多卷积核卷积计算

2.6.1、基本工作原理

2.6.2、具体操作方法

2.7、特征图大小

三、卷积核是如何检测特定模式或特征的?

3.1、边缘检测的原理

3.2、不同类型的特征检测

3.3、卷积层API

四、池化层

4.1、什么是池化层

4.2、如何进行池化层的计算

4.3、多通道池化计算

4.4、池化层API

五、图像分类案例

5.1、CIFAR10 数据集

5.2、搭建图像分类网络

5.3、编写训练函数

5.4、加载训练好的模型

5.5、模型优化

1. 增加卷积核输出通道

2. 增加全连接层的参数量

3. 调整学习率

4. 调整优化方法

5. 修改激活函数

6、其他重要改进


一、什么是卷积神经网络CNN

1.1、核心概念

卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络,卷积层的作用是用来自动学习,提取图像特征,CNN网络主要由三部分构成:卷积层,池化层和全连接成构成:

  1. 卷积层负责提取图像中的局部特征;
  2. 池化层用来大幅降低参数量级(降维);
  3. 全连接层用来输出想要的结果。

1.2、卷积层

主要功能是通过卷积运算从输入数据中提取特征,卷积层使用一组科学系的滤波器(filters)或者卷积核(kernels),这些滤波器在输入数据上滑动并计算卷积,每个滤波器会检测输入数据中的特定模式,如边缘,纹理等,主要参数:

  • 滤波器大小:通常为3×3、5×5等
  • 步长(stride):滤波器每次移动的像素数
  • 填充(padding):在输入边缘添加像素以控制输出尺寸

卷积核其实就是一个小的数值矩阵,通常是正方形,比如3*3,5*5等大小,这个矩阵中的每个数值都是可以学习和调整的参数

  • 如果卷积核是3×3大小,那它就像一个小窗口,一次只能看到图像的一小部分(3×3像素区域)
  • 这个窗口在整个图像上滑动,每到一个位置就计算一次"匹配度"(点积)

在神经网络中,卷积核的值不是手动设计的,而是通过训练自动学习的

二、什么是卷积计算

卷积是数学中的一种特殊运算,在信号处理和深度学习领域有广泛的应用,

  • 开始时,卷积核的值是随机初始化的
  • 网络通过大量图像进行训练
  • 根据任务的需要,卷积核的值会被逐渐调整
  • 训练完成后,第一层的卷积核通常会学习到边缘、纹理等低级特征
  • 更深层的卷积核则会学习到更复杂的特征,如眼睛、鼻子、轮廓等

在图像处理和卷积神经网络中,使用的是二位离散卷积:

(I * K)[i,j] = ∑∑ I[i+m,j+n]K[m,n]

卷积计算是:

  • 将卷积核翻转180度
  • 将翻转后的卷积核在输入数据上滑动
  • 在每个位置计算卷积核与对应输入区域的元素乘积之和

在卷积神经网络中实际使用的是互相关(cross-correlation)而非严格数学定义的卷积,区别在于互相关不需要翻转卷积核

2.1、卷积计算的例子:

假设我们有一个5×5的输入矩阵和一个3×3的卷积核:

输入;

1 2 3 1 2
3 1 2 1 3
2 3 1 2 1
1 2 3 1 2
3 1 2 1 3

卷积核:

1 0 1
0 1 0
1 0 1

计算单个输出位置的值,例如输出的[0,0]位置:

  • 取输入的左上角3×3区域
  • 将其与卷积核对应元素相乘后求和
  • 结果为: 1×1 + 2×0 + 3×1 + 3×0 + 1×1 + 2×0 + 2×1 + 3×0 + 1×1 = 8

2.2、点积

在代数形式中,点积等于对应元素的乘积和:

A·B = a₁×b₁ + a₂×b₂ + ... + aₙ×bₙ

点积可以理解为:

  • 一个向量在另一个向量方向上的投影长度与另一向量长度的乘积
  • 两个向量相似度的度量(夹角余弦)
  • 对应位置元素乘积的总和

假设有两个三维向量:

  • A = [2, 3, 4]
  • B = [1, 5, 2]

它们的点积为:

A·B = 2×1 + 3×5 + 4×2 = 2 + 15 + 8 = 25

2.3、卷积与点积的关系

在卷积运算中,我们实际上是在计算卷积核与输入的局部区域之间的点积:

  • 卷积核可以视为一个向量(将矩阵展平)
  • 输入的每个局部区域也可以视为一个向量
  • 卷积结果中的每个元素是对应局部区域与卷积核的点积

总的来说,点积是卷积计算的基础操作,而卷积则是在不同位置重复应用点积的过程,用于检测输入数据中的局部模式或特征

2.4、Padding(填充)

Padding是指在输入数据(通常是图像)的边缘的周围添加额外的像素值,再进行卷积操作,在卷积操作中,卷积核(滤波器)会在输入上滑动并计算卷积值,当卷积核位于边缘时,如果不使用padding,卷积核会“悬空”,无法完全覆盖输入数据,导致输出特征图的尺寸小于输入,padding最常见的填充值是0(zero padding)

2.4.1、Padding的主要作用
1、控制输出特征图尺寸

Padding最重要的作用是控制卷积操作后输出特征图的空间尺寸

如果不适用padding,输出特征图的尺寸会按照以下公式计算:

输出尺寸 = (输入尺寸 - 卷积核尺寸) / 步长 + 1

例如,对于32×32的输入图像,使用5×5的卷积核和步长为1时,输出特征图将是28×28。

而当添加padding后,可以保持输出特征图与输入相同尺寸("Same padding"),计算公式为:

padding = (卷积核尺寸 - 1) / 2  (当步长为1时)
2、保留边缘信息

不使用padding时,图像边缘的像素只被卷积操作使用一次,而中心区域的像素则被多次使用,这导致模型对边缘信息的学习不足。

添加padding后,边缘像素参与的卷积计算次数增加,使得模型能够更好地保留和学习图像边缘的特征信息,提高特征提取的效果。

3. 支持深层网络训练

在深层CNN中,如果每次卷积都不使用padding,特征图的尺寸会迅速减小,可能只经过几层就变得很小,限制了网络的深度。

使用padding可以保持特征图尺寸,使得我们能够构建更深的网络架构,从而学习更复杂的特征表示。

2.4.2、Stride

按照步长为1来移动卷积核,计算特征图:

如果把Stride增大为2,也可以提取特征图:

2.5、多通道卷积计算

实际中的图像是几多个通道组成的,多通道卷积就是使用一组滤波器(filter)在多个通道上同时滑动,每个滤波器负责检查自己对应的那一层,每个滤波器在各自位置上计算卷积,然后将各自卷积计算的值相加,得到一个新的特征图

2.6、多卷积核卷积计算

当使用多个卷积核进行特征提取时,每个卷积核就像是一个专门的"探测器",负责寻找输入数据中的不同模式或特征

2.6.1、基本工作原理

使用多个卷积核时,特征提取的过程是这样的:

  1. 并行探测:每个卷积核独立地在输入数据上滑动,生成自己的特征图。
  2. 特征图集合:假设有N个卷积核,就会产生N个特征图,每个特征图代表输入数据中一种特定的特征。
  3. 特征整合:这N个特征图组合在一起,形成下一层的输入,包含了丰富的特征信息
2.6.2、具体操作方法
  • 卷积核设计
    • 使用不同初始权重的多个卷积核
    • 每个卷积核尺寸通常相同,但内部权重不同
    • 常见的卷积核数量从几个到几百个不等
  • 特征图生成
    • 每个卷积核产生一个特征图
    • 如果有64个卷积核,就会得到64个特征图
  • 批量规范化和激活
    • 对特征图应用批量规范化使训练更稳定
    • 通过ReLU等激活函数引入非线性
  • 特征组合
    • 将所有特征图在通道维度上堆叠
    • 得到的多通道输出传递给下一层

多个卷积核工作就像多个专家同时分析同一个问题

  • 有的卷积核可能专注于检测边缘
  • 有的可能擅长识别纹理
  • 有的可能对特定颜色变化敏感
  • 有的可能检测特定形状

通过这种"集体智慧"的方式,网络能够提取更全面、更丰富的特征信息,为后续的分类或检测任务提供更好的基础。

2.7、特征图大小

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

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

计算方法:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘

uniapp-文件查找失败:‘dcloudio/uni-ui/lib/uni-icons/uni-icons.vue’ 今天在HBuilderX中使用uniapp开发微信小程序时遇到了这个问题,就是找不到uni-ui组件 当时创建项目,选择了一个中间带的底部带选项卡模板,并没有选择内置u…

Vue2.x 和 Vue3.x 对比-差异

Vue3的优点 diff算法的提升 vue2中的虚拟DOM是全量的对比,也就是不管是写死的还是动态节点都会一层层比较,浪费时间在静态节点上。 vue3新增静态标记(patchflag ),与之前虚拟节点对比,只对比带有patch fla…

MacOS 用brew 安装、配置、启动Redis

MacOS 用brew 安装、配置、启动Redis 一、安装 brew install redis 二、启动 brew services start redis 三、用命令行检测 set name tom get name

agentmain对业务的影响

前面一篇已经说了java agent技术主要有premain和agentmain两种形式,如果大部分业务已经在线上运行的话,不方便用premain的方式来实现,所以agentmain的方式是更加通用、灵活的 由于RASP是与用户业务运行在同一个jvm中的 ,所以RASP…

uniapp小程序轮播图高度自适应优化详解

在微信小程序开发过程中,轮播图组件(swiper)是常用的UI元素,但在实际应用中经常遇到高度不匹配导致的空白问题。本文详细记录了一次轮播图高度优化的完整过程,特别是针对固定宽高比图片的精确适配方案。 问题背景 在开发"零工市场&quo…

基于ESP32控制的机器人摄像头车

DIY Wi-Fi 控制的机器人摄像头车:从零开始的智能探索之旅 在当今科技飞速发展的时代,机器人技术已经逐渐走进了我们的生活。今天,我将带你一起探索如何制作一个 Wi-Fi 控制的机器人摄像头车,它不仅可以远程操控,还能通…

基于STM32的LCD信号波形和FFT频谱显示

一、项目准备 主要利用LCD驱动中的画点和画连线函数,驱动是正点原子给我写好了的画点和画线的函数等些相关函数 void LCD_Draw_Circle(u16 x0,u16 y0,u8 r); //画圆 void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); //画线 二、画波形图函数实…

(9)被宏 QT_DEPRECATED_VERSION_X_6_0(“提示内容“) 修饰的函数,在 Qt6 中使用时,会被编译器提示该函数已过时

(1)起因是看到 Qt 的官方源代码里有这样的写法: #if QT_DEPRECATED_SINCE(6, 0) //里面的都是废弃的成员函数QT_WARNING_PUSHQT_WARNING_DISABLE_DEPRECATEDQT_DEPRECATED_VERSION_X_6_0("Use the constructor taking a QMetaType inst…

关于mac配置hdc(鸿蒙)

关于mac配置hdc(鸿蒙) 在最开始配置的hdc -v时候老是出现格式不匹配 于是乎在网上找官网也不行,最后在csdn上找到了这篇文章Mac配置hdc才有的头绪 环境变量的问题 自己做一个简单的总结 首先在访达里面打开ide 打开之后输入下面的命令,一步一步的找…

是 OpenCV 的 CUDA 模块中用于在 GPU 上对图像或矩阵进行转置操作函数cv::cuda::transpose

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::transpose 是 OpenCV 的 CUDA 模块中的一个函数,用于在 GPU 上对图像或矩阵进行转置操作(Transpose&#xff0…

PPT图表怎么制作?说5款自己使用过的PPT图表制作工具

PPT图表怎么制作?准备一份吸引人的PPT演示文稿时,图表往往能起到画龙点睛的作用。但是,对于很多人来说,制作既美观又专业的图表却不是一件容易的事情。今天,我们就来聊聊如何利用一些优秀的工具制作PPT图表。 1、亿图图…

[传输层]TCP协议

文章目录 报文格式连接管理可靠传输 面向连接的传输层协议 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的 TCP提供可靠有序,不丢不重 TCP是面向字节流的 TCP工作模型: 发送方有一个缓存,缓存: 1.待发送 2…

Linux(1)编译链接和gcc

1、gcc分布编译链接 (1)预编译 gcc -E main.c -o main.i (2)编译 gcc -S main.i -o main.s (3)汇编 gcc -c main.s -o main.o (4)链接 gcc main.o -o main 执行&#xff1a…

【Java ee初阶】网络编程 UDP socket

网络编程 socket api 是传输层提供的api。 UDP 无连接,不可靠传输,面向数据报,全双工。 TCP 有链接,可靠传输,面向字节流,全双工。 UDP socket api 数据报 DatagrammSocket 代表了操作系统中的socket文…

旅游推荐数据分析可视化系统算法

旅游推荐数据分析可视化系统算法 本文档详细介绍了旅游推荐数据分析可视化系统中使用的各种算法,包括推荐算法、数据分析算法和可视化算法。 目录 推荐算法 基于用户的协同过滤推荐基于浏览历史的推荐主题推荐算法 亲子游推荐算法文化游推荐算法自然风光推荐算法…

c语言第一个小游戏:贪吃蛇小游戏08(贪吃蛇完结)

贪吃蛇撞墙和想不开咬死自己 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake food; struct snake *head; struct snake *tail; int key; int dir; #define UP 1 #define DOWN -1 …

使用PhpStudy搭建Web测试服务器

一、安装PhpStudy 从以下目录下载PhpStudy安装文件 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 安装成功之后打开如下界面 点击启动Apache 查看网站地址 在浏览器中输入localhost:88,出现如下页面就ok了 二、与Unity交互 1.配置下载文件路径&#xff0c;点击…

c语言第一个小游戏:贪吃蛇小游戏06

实现贪吃蛇四方向的风骚走位 实现代码 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; int key; int dir; //全局变量 #define UP 1 //这个是宏定义&a…

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域&#xff0c;应用程序的启动过程就像音乐的序曲&#xff0c;决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时&#xff0c;会让大多数用户产生负面看法&#xff0c;而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…

一文详解Spring Boot如何配置日志

一、写在前面 对于日志文件&#xff0c;相信大家都并不陌生&#xff0c;通过在关键位置打印相关的日志&#xff0c;有利于快速跟踪和定位软件系统运行中存在的问题。 在之前的 Java 实现日志记录的文章中&#xff0c;我们介绍了能实现日志记录的主流框架有 Log4j、Log4j2、Lo…