11-09 周四 CNN 卷积神经网络基础知识
| 时间 | 版本 | 修改人 | 描述 |
|---|---|---|---|
| 2023年11月9日09:38:12 | V0.1 | 宋全恒 | 新建文档 |
简介
学习一下CNN,卷积神经网络。使用的视频课程。视觉相关的任务:
- 人脸识别
卷积网络与传统网络的区别:
<img alt=image-20231109094400591 src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fyanchenmochen%2Fimgs%2Fimgsimage-20231109094400591.png&pos_id=img-Z35hmB60-1699522025179)>
<img alt=image-20231109094414779 src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fyanchenmochen%2Fimgs%2Fimgsimage-20231109094414779.png&pos_id=img-08hzm0rf-1699522028665)>
卷积神经网络是一个三维的数据,是h*w*c
整体架构
<img alt=image-20231109094649673 src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fyanchenmochen%2Fimgs%2Fimgsimage-20231109094649673.png&pos_id=img-AGVXtOFG-1699522031824)>
- 输入层
- 卷积层
- 池化层
- 全连接层
卷积层
调度卷积核是5*5*3,也是一个立方体的。
卷积神经网络也是使用一组权重参数进行加权求和得出的。
<img alt=image-20231109094831385 src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fyanchenmochen%2Fimgs%2Fimgsimage-20231109094831385.png&pos_id=img-pBCi31QD-1699522034969)>
注: 上图仅演示了一个通道,图像是3通道。
相当于权重参数矩阵为:
<img alt=image-20231109095218835 src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fyanchenmochen%2Fimgs%2Fimgsimage-20231109095218835.png&pos_id=img-ZZahJ8Qu-1699522038141)>
卷积神经网络的目的也是找到一组最佳的权重参数。
注: 卷积核的第三个维度一定要一样才行。卷积采用内积实现。Filter的尺寸一般为3, 5,7。 在进行卷积核的时候与卷积核的第三个维度数量相等。
<img alt=image-20231109105238890 src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fyanchenmochen%2Fimgs%2Fimgsimage-20231109105238890.png&pos_id=img-41nSowP4-1699522038975)>
5x5x3代表一个卷积核,该卷积核的深度为3,与输入的深度相同。得到一个特征图,深度与输入图相同。卷积核可以有多个,则可以得到多个特征图。即Feature W0, Feature W1, … 经过多个卷积核得到多个特征图feture picture。
如下图所示:
上图经过卷积层得到了28 * 28 * 6个特征图。
将经过卷积核卷积之后的图堆叠在一起,得到了特征图堆。并且,卷积应该经过多次,依次得到Low-level Feature, Mid-Level Feature, High-Level Feature。也就是说,一次卷积是不够的。
上图说明卷积核5 * 5 * 3得到的是一个值,一个立方体得到一个值。也就是说,一个图如果一个卷积核扫描完全部得到的是一个28 * 28 * 1的图。使用6个卷积核,则得到的卷积图是28 * 28 * 6.
第二卷积是10个 5x5x6得到就是24 * 24 * 10。
卷积核涉及参数
步长
步长为1,得到5 * 5, 而步长为2, 得到3 *3 。 相当于步长越小,得到的特征较多,越丰富。一般视觉任务使用的步长为1,但相应的计算量较大,文本类任务,也有使用步长为2.
卷积核尺寸
卷积核尺寸越小,越细粒度。 一般是3 * 3。
边缘填充
+pad,边缘填充属性。
越往边界的点,被利用的次数越少。下图中原始输入是5 * 5,通过边缘填充在边缘上变成了7 * 7. 又不希望添加的值影响计算。所以一般使用zero padding。
卷积计算公式
对于下面的案例,可以得到输出的尺寸:

在听这个课程的时候,学习了卷积核的作用。卷积核的深度与输入是相同的,因此,卷积核是一个立方体。但是得到的结果确实一个平面。因为一个输入图像区域只得到了一个值
具体可以参见 3D
2D卷积可以参见 2D卷积
卷积参数共享
卷积参数共享一个巨大的好处就是参数共享,同样的一组参数对图像中每个小区域进行处理。相对于传统的神经网络,参数降低了非常多。
10个 5 * 5 * 3卷积核,共75 * 10 =750个卷积参数 再加上10个偏置项共760个参数。
池化层
卷积层的特征点太多,会导致计算量过大。而且有些特征对于任务并不重要。因此可以通过池化进行瘦身。降采样 downsample。
降采样的方式有最大值采样,平均值采样。 降采样也有区域和步长。2 * 2 并且步长为2.池化层不涉及矩阵操作,而是仅仅筛选动作。
- max pooling 最好的特征。
- 平均值池化 average pooling 用的比较少。
任务
如下图,卷积层要经过relu, 非线性变换。卷积层和relu是一组。经过卷积组,池化,然后最后一个全连接FC进行分类。
每个卷积组:
- 卷积
- Relu
在卷积层最后进行全连接时,需要将特征图进行拉长操作,将图拉成一个特征向量。最后与分类数量个神经元进行全连接。
一层神经网络: 带参数计算。relu是没有参数计算的。即激活没有参数。即POOL也没有参数计算的。如下图一共是7层神经网络。
特征图变化如下:
上图中转换即拉伸成向量。
Alexnet-2012
227 * 227 * 3
VGG-经典网络-2014
VGG filter均为3 * 3,卷积核比较小,网络层数为16。在池化后,通过增加卷积次数,即增加特征图的数量来弥补池化的损失。但Alexnet训练8小时,VGG可能需要3天才能训练完成。
VGG 在实验室 16层的网络,比30层的时候效果好,因为深度学习,越深越好,但实验结果令人失望,深度学习进入低谷。
Resnet残差网络-2015
何凯明的工作,将增加层数中具有促进效果的层数保留,网络训练的结果一定不会比之前差。
相当于残差网络拯救了深度学习神经网络。Resnet更加经典,更主流。
下图中橙色为Resnet,误差更小。
感受野
感受野有什么作用:希望感受野越来越大。3个3 * 3 得到的感受野为7 * 7, 那么与直接使用7 * 7的卷积核进行卷积需要的区别。
堆叠小的卷积核需要的参数越少,训练更快。而且小卷积核由于经过的relu次数多,非线性特征保存的更好。
项目实战
构造神经网络
conv + relu 是一个组合。
-
in_channels : 通道数。
-
out_channels: 16,使用16个特征图。
-
kernel_size=5; 卷积核尺寸5 * 5
-
stride = 1; 步长。
-
padding=2 ; 边缘填充。
-
前向传播得到预测结果
训练
使用pytorch进行训练。
Vision模块
TorchVision有许多的数据集。
-
数据预处理
- dataset数据集
-
网络模块设置
分类任务
semantic segmentation
object detection, instance segmentation and Person Keypoint Detection
Video classfication
- 甚至可以拿到别人的预训练模型
- 网络模型保存和测试
- transforms
- PIL Image
- transforms
任务
任务介绍
flowers 一共102种分类。
要把数据和标签读进来。ImageFolder工具。
- 数据预处理
- DataLoader模块直接读取batch数据
- 网络模块设置
- 迁移学习
- 需要把head层改一改 256 * 256 , 224 * 224
- 训练时可以全部重新训练,也可以只训练咱们任务的层,本质目标是一致的。
- 网络模型保存与测试
数据增强Data Augmentation
让数据量更多。
数据不够时,这样做。
如何更好的利用数据,倾斜,水平和垂直翻转,旋转,放大和缩小,即得到一个新的数据。
一般,网络的输入大小是固定的,因此,需要resize成预期大小。
下面代码中CenterCrop(224)中心裁剪。
RandomhorizontalFlip(p=0.5)概率值,是随机翻转的概率。
亮度,对比度,饱和度 色相。
transforms.Normalize() 即要进行标准化,参数1为均值, 参数2为标准差
具体的样例代码:
训练集做了标准化,则测试集也要做相同的标准化。
数据加载
读取标签对应的名字
展示下数据
迁移学习
迁移学习的目标是用别人训练好的参数来执行任务。尽可能差异比较少一些。
那么迁移学习,学那个部分呢:
- A: 使用卷积层的权重参数进行初始化。
- B: 将人家训练好的参数冻住。对全连接层进行重新定义。
- 数据量越小,冻住的参数越多。不到10000.
- 数据量10000多,两万。挑出来一些。
迁移学习,学习的非常快。迁移学习拿过来的模型都是经过大量实验的结果,经典网络结构,得到的结果更快也更好。如VGG, ResNet。
模型加载
需要指定模型名称
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
需要修改最后全连接层,为当前用户的任务分类数目。
加载模型,并使用预训练模型。
~/.cache/checkpoints/resnet152-b121ed2d.pth
model_ft = models.resnet152(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
num_ftrs=model_ft.fc.in_features
model_ft.fc = nn.Sequential(nn.Linear(num_ftrs,102), nn.LogSoftmax(dim=1))
input_size= 224
设置那些层需要训练
如下的参数中:
- model_name 指定了要使用的模型
- 102 指定了目标分类数
- feature_extract: 是否要冻住某些模型
- use_pretrained: 是否要使用预训练模型。
显示那些参数需要重新开始训练。
优化器设置
使用了学习率的衰减函数。效果会更稳定一些。
训练模块
保存模型参数权重字典
准确率
优化器参数权重字典
开始训练
model_fit, val_acc_history, train_acc_history, valid_losses, train_losses, LRs = train_model(model_ft, dataloaders, criterion, optimizer, num_epoches=10, is_inception=(model_name=='inception'))
测试网络效果
完整训练
将所有参数的require_grad设置为TRue,将学习率调整的小一些,以为之前用了别人的网络参数,学习率过大,可能会破坏掉之前的训练参数。
<img alt= src=https://cdn.jsdelivr.net/gh/yanchenmochen/imgs/imgsimage-20231109165735676.png>
Load the checkpoint
加载之前保存的最好的模型继续开始训练。
实际测试
加载模型
测试数据预处理
将一张图像处理成输入。
得到处理结果
8是因为batchsize。
总结
看了一天这个课程,终于看完了,对于卷积神经网络也算是有了更加进一步的理解了。现在就是要多多实战,敲代码就好了。现在还有点困惑的点包括:
- 优化器的选择
- 损失函数的选择
不过,这个课程让自己对于卷积的理解加深了许多。
相关文章:
11-09 周四 CNN 卷积神经网络基础知识
11-09 周四 CNN 卷积神经网络 时间版本修改人描述2023年11月9日09:38:12V0.1宋全恒新建文档 简介 学习一下CNN,卷积神经网络。使用的视频课程。视觉相关的任务: 人脸识别 卷积网络与传统网络的区别: <img altimage-20231109094400591 s…...
Vue.js中的路由(router)和Vue Router的作用?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
从开源项目聊鱼眼相机的“360全景拼接”
目录 概述 从360全景的背景讲起 跨过参数标定聊透视变化 拼接图片后处理 参考文献 概述 写这篇文章的原因完全源于开源项目(GitHub参阅参考文献1)。该项目涵盖了环视系统的较为全貌的制作过程,包含完整的标定、投影、拼接和实时运行流程。该篇文章主要是梳理全…...
网络安全——
文章目录 网络安全TCP/IP与网络安全网络安全构成要素加密技术基础 网络安全 TCP/IP与网络安全 起初,TCP/IP只用于一个相对封闭的环境,之后才发展为并无太多限制、可以从远程访问更多资源的形式。因此,“安全”这个概念并没有引起人们太多的…...
用excel 整理工作流程,以周为时间节点,自动统计进度
无论是处理自己还是团队的工作,我们都经常会遇到复杂的,凌乱的,需要多个环节才能完成的工作。 梳理工作流程 因为环节内容,每个环节处理不当都可能会导致我们整个工作目标实现受到影响,所以通过工作流程图,…...
Wireshark学习 与 TCP/IP协议分析
Wireshark简介和工具应用 如何开始抓包? 打开wireshark,显示如下网络连接。选择你正在使用的,(比如我正在使用无线网上网),双击 可以先看下自己的ip地址和网关ip地址(看抓包数据时候会用到&…...
Sequence(矩阵连乘+数论)
求Fn mod 1e97 Input 第一行是一个t代表有t组数据 接下来有t行每行有6个整数A,B,C,D,P,n 1<t<10 0<A,B,C,D<1e9 1<p,n<1e9 Output 输出一个答案Fn对1e97取余 Sample Input 2 1 1 1 1 1 5 1 1 1 1 10 4 Sample Output 9 10 思路: p/n上…...
集合工具类的常用方法--小总和
前言 集合工具类是Java中的一个重要工具类,在Java常用的集合框架中起到了重要的作用。集合工具类提供了一系列的方法,可以方便地处理Java中的集合对象,提高了开发的效率。 Collections类 Collections.sort(List<T> list) 对List集合进…...
一文了解游戏行业(数据分析)
一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发,发行和销售等环节 ①游戏开发 上游环节是游戏产业链的核心环节,包括游戏策划,美术设计,程序开发等,是决定游戏质量与内容的关键因…...
Flutter之Json序列化
前言 使用 json_annotation 框架实现json字符串序列化和反序列化 框架官方地址:json_serializable 一、引入依赖:在pubspec.yaml中添加 dependencies:json_annotation: ^4.8.1dev_dependencies:build_runner: ^2.3.3json_serializable: ^6.6.0 二、…...
Java基础——局部变量和常量
变量:内存中的一个存储区域(该区域的数据可以在同一类型范围内不断变化)。 常量:一旦声明就不可变,通常用 final 修饰的变量称为常量。 声明格式: [final] 变量类型 变量名;说明: final修饰…...
番外 1 : Java 环境下的 selenium 搭建
Java 环境下的 selenium 搭建 一 . 下载谷歌浏览器二 . 下载谷歌浏览器驱动2.1 查看谷歌浏览器版本2.2 下载对应版本的谷歌驱动2.3 解压下载好的驱动压缩包 , 将下载好的 chromedriver.exe 放到java 系统环境变量下 三 . 下载 Edge 浏览器的驱动3.1 查看 Edge 浏览器的版本3.2 …...
游戏缺失d3dx9_39.dll的5个修复方法,深度解析d3dx9_39.dll文件的作用
在当今的数字化时代,电子游戏已经成为了人们休闲娱乐的重要方式之一。然而,对于许多玩家来说,他们在享受游戏带来的乐趣的同时,也可能会遇到各种各样的问题,其中最常见的就是游戏无法正常运行。而这些问题中࿰…...
RHCSA --- Linux用户/组权限
用户管理 useradd 创建用户 -u(UID) 指定UID -g(GID) 指定基本组 -G(GID1,GID2,...) 指定附加组 -c “注释信息” 指定用户注释信息(昵称) -d /path…...
怎么做到高性能网络IO?
为什么要做高性能网络IO。主要是解决c10,c10M问题 最开始的时候我们走的内核协议栈,走内核协议栈其实性能比较低,因为我们之前介绍的时候需要拷贝两次 但是我们采用用户态协议栈可以少拷贝一次,可以大大提高效率, 步骤…...
设计模式-创建型
文章目录 设计模式-创建型工厂模式简单工厂工厂方法抽象工厂 建造者模式单例模式原型模式 设计模式-创建型 本章主要介绍有关对象创建的几种设计模式。 工厂模式 工厂模式:封装了对象的创建,使得获得对象更加符合实际逻辑 简单工厂 将所有对象的生产…...
Word通过Adobe打印PDF时总是报错,打开记事本
Word文档打印,选择Adobe作为打印机,打印过程中总是报错,不断打开记事本,提示打印出错,错误信息如下: %%[ ProductName: Distiller ]%% %%[Page: 1]%% %%[Page: 2]%% %%[ Error: invalidfont; OffendingCom…...
第2关:还原键盘输入(list)
题目: 知识点: 列表list相较于数组: 优势:可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势:无法直接进行下标索引,需要迭代器it逐个遍历。 代码: #include <iostream>…...
数据结构 | 栈的实现
数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 Stack.h初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。…...
python异常、模块与包
1.异常 异常:当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。 1.1捕获异常 基本语法: try:可能发生错误代码 except:如果出现…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
