CNN笔记详解

CNN(卷积神经网络)

计算机视觉,当你们听到这一概念的是否好奇计算机到底是怎样知道这个图片是什么的呢?为此提出了卷积神经网络,通过卷积神经网络,计算机就可以识别出图片中的特征,从而识别出图片中的物体。看到这里充满疑惑了把!接下来我们将依次介绍人工神经网路,CNN(卷积神经网络)并详细介绍卷积层,池化层,全连接层。来教你理解CNN的工作流程。

1. 人工神经网路

1.1 神经元

如下图所示,每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。线性变换就是 y = w 1 ∗ x 1 + b y = w_1 * x_1 + b y=w1x1+b

在这里插入图片描述

之前没了解过的人看到这里就很蒙了,为什么一个线性变化就可以得到所需要的特征呢?这里我们举个例子来说明:

明天有一场聚会,你去不去呢?影响的因素有:
聚会内容记为 x 1 x_1 x1, x 1 = 1 x_1 = 1 x1=1代表有你喜欢的聚会内容,如果你有5个聚会内容都很喜欢你可以将 w 1 = 5 w_1 = 5 w1=5 x 1 = 0 x_1 = 0 x1=0代表没你喜欢聚会的内容。
聚会参与者记为 x 2 x_2 x2, x 2 = 1 x_2 = 1 x2=1代表有你喜欢的白月光,如果有可以将 w 2 = 100 w_2 = 100 w2=100, x 2 = 0 x_2 = 0 x2=0代表没有喜欢的人。
最后通过加权求和 y = w 1 ∗ x 1 + w 2 ∗ x 2 + b y = w_1 * x_1 + w_2 * x_2 + b y=w1x1+w2x2+b,就可以得到你想不想去的结果了。假如你喜欢聚会内容,并且有喜欢的人,那么 y = 100 + 5 + 10 = 115 y = 100 + 5 + 10 = 115 y=100+5+10=115,b是偏置项,这里理解为为更好达到目的而设置的偏置项,那么你就可以去参加这个聚会了。但是有人会提出疑问了,去不去似乎用概率来描述更合适,所以我们可以对y进行一个非线性变化,也就是增加非线性激活函数来使结果在0到1之间。常见的非线性激活函数有:

sigmoid函数
y = 1 1 + e − x y = \frac{1}{1 + e^{-x}} y=1+ex1
tanh函数
y = e x − e − x e x + e − x y = \frac{e^x - e^{-x}}{e^x + e^{-x}} y=ex+exexex
ReLU函数
y = m a x ( 0 , x ) y = max(0, x) y=max(0,x)
Leaky ReLU函数
y = m a x ( 0.01 x , x ) y = max(0.01x, x) y=max(0.01x,x)

这里对sigmoid函数进行一个简单的解释:

在这里插入图片描述

通过图像我们知道该激活函数将输入映射到0-1之间,可以很好的实现我们的目标。下面我们用代码实现一下:

import numpy as npdef sigmoid(x):return 1 / (1 + np.exp(-x))print(sigmoid(115))
1.0

输出结果为1,代表我们特别特别想去这个聚会。

1.2 神经网络

在这里插入图片描述

将多个上图中的神经元连接起来就可以得到下图中的神经网络。

在这里插入图片描述

上图最左边叫做输入层,中间部分叫做隐藏层,最右边叫做输出层。
输入层:你将要喂入的数据,通常用于处理原始数据,如数据归一化,数据输入的形状等
隐藏层:神经网络的计算过程,隐藏层通常用于提取特征,学习输入数据之间的关联和模式。隐藏层的状态(神经元的输出值)通常被认为是模型的知识库。
输出层:神经网络的输出结果,可能包含一个或多个神经元。

在这里插入图片描述

2. CNN(卷积神经网络)

在这里插入图片描述

上图中最左边输入的是一张图片,那么电脑是如何来提取图片特征,来识别出他是马还是车还是人的呢?在我们眼中图片就是图片,但是在计算机中图片就是由一个个像素点组成的,每个像素点都有RGB三个值,分别代表红,绿,蓝。下图中我们将展示一个灰度图像。

在这里插入图片描述

上图又称为灰度图像,因为其每一个像素值的范围是0255(由纯黑色到纯白色),表示其颜色强弱程度。另外还有黑白图像,每个像素值要么是0(表示纯黑色),要么是255(表示纯白色)。我们日常生活中最常见的就是RGB图像,有三个通道,分别是红色、绿色、蓝色。每个通道的每个像素值的范围也是0255,表示其每个像素的颜色强弱。但是我们日常处理的基本都是灰度图像,因为比较好操作(值范围较小,颜色较单一),有些RGB图像在输入给神经网络之前也被转化为灰度图像,也是为了方便计算,否则三个通道的像素一起处理计算量非常大。当然,随着计算机性能的高速发展,现在有些神经网络也可以处理三通道的RGB图像。

# 使用opencv打开图片
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('./image/v2-efd4f4517d5bdb43858a04f7e4ff5f7f_r.jpg')print(img)
[[[156 172 185][156 172 185][156 172 185]...[116 127 141][115 126 140][115 126 140]][[156 172 185][156 172 185][156 172 185]...[116 127 141][115 126 140][115 126 140]][[156 172 185][156 172 185][156 172 185]...[116 127 141][115 126 140][115 126 140]]...[[210 219 232][208 217 230][205 214 227]...[173 182 196][173 182 196][170 179 193]][[209 218 231][208 217 230][207 216 229]...[174 183 197][172 181 195][170 179 193]][[209 218 231][209 218 231][208 217 230]...[174 183 197][172 181 195][169 178 192]]]
print(img.shape)
(1350, 1080, 3)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.axis('off')
plt.imshow(img)
<matplotlib.image.AxesImage at 0x1b06eb1fb50>

在这里插入图片描述

通过上面的代码我们可以知道图片在计算机中是以矩阵来存储的。上述代码只是演示的作用不需要读者理解,如果感兴趣可以去自行学习

那么CNN是怎么进行识别的呢?

计算机中存储了一个正确的图片例如‘X’,然后将输入的图片跟正确的图片进行比较,如果二者一致则判定为‘X’,并且经过旋转、缩放、平移等变换后,计算机也能正确识别出‘X’。因为我们识别的图片不可能跟保存的图片一模一样。

在这里插入图片描述

上图中左右两个图片都是’X‘,但是它们在计算机中存储的矩阵完全不同。假如我们这里黑色为0,baise为1,那么两张图片的矩阵肯定不一样,如果按照像素值一个一个的对比那么计算机会死板的觉得两个是不一样的东西,所以CNN就是用来解决这一问题的。CNN是将两幅图片的一部分进行挨个比较。例如上图中有绿色,紫色,橙色三个小部分,通过对三个小区域的比较来进行判断远远优于对整幅图片进行比较。

看到这里是不是对CNN有点感觉了,下面我们将详细介绍卷积操作。

什么是卷积?

卷积:对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
这里的滤波矩阵称为卷积核

在这里插入图片描述

卷积核通过在输入图像上不断的移动,每一次移动都进行一次乘积求和,作为此位置的值。上图形象的展示了卷积核的移动过程,通过不断的移动我们可以得到图片每个区域的特征。浅蓝色的部分为输入的原图像,深色为卷积核,不动的绿色为输出的特征值。这完全实现了我们想要的,提取图片每个区域的特征后进行比较。
但是有人就会发现每次卷积核移动的时候中间部分都被计算了,而边缘的只被计算了一次,这样子中间的特征加强了,边缘的特征不就被弱化了(特征丢失),导致结果并不准确。所以为了解决这个问题我们可以在原图像的周围扩展几圈用0进行填充,这样就不会造成特征丢失了。如下图所示。

在这里插入图片描述

下图展示了更复杂的特征提取,我们都知道彩色图片是RGB三通道组成的,下图是用两个卷积核对彩色图片进行特征提取,卷积过程如下所示。最后我们会得到两个特征矩阵。

在这里插入图片描述

卷积整体过程就如下图所示:卷积核在图片上不断移动得到特征值。

在这里插入图片描述

以上就是卷积层的基础知识。感觉还不错把!接下里我们将解释涉及到池化层,和全连接层

3. 池化层

池化:池化层是卷积神经网络中的一种特殊层,用于对输入数据进行降维,减少参数数量,提高网络的泛化能力。池化层通常位于卷积层之后,可以对卷积层的输出进行下采样操作。池化层可以分为最大池化和平均池化两种类型。最大池化是指选择每个池化区域的最大值作为输出,平均池化是指选择每个池化区域的平均值作为输出。池化层可以用于减少特征图的尺寸,同时保持主要特征不变。

在这里插入图片描述

上图展示的就是最大池化,取区域最大值作为输出。

全连接层

全连接层:就是将之前的卷积层和池化层得到的特征值进行拼接,然后将拼接后的特征值输入到全连接层中,全连接层的作用就是将特征值映射到输出层,从而实现对输入数据的分类。例如我们通过卷积和池化提取到了这个眼睛,嘴巴,鼻子等特征,如果我们利用这些特征来判断是为人还是猫,我们只需要将提取到的所有特征图进行“展平”,将其维度变为1 × x,这个过程就是全连接的过程,也就是说,此步我们将所有的特征都展开并进行运算,最后会得到一个概率值,这个概率值就是输入图片是否是人的概率,这个过程如下所示:

在这里插入图片描述

import torch.nn as nn
import torch.nn.functional as F
import torchclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))print(x.shape)x = x.view(-1, 16 * 5 * 5)print(x.shape)x = F.relu(self.fc1(x))print(x.shape)x = F.relu(self.fc2(x))x = self.fc3(x)return x
net = Net()
print(net)
Net((conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))(pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(fc1): Linear(in_features=400, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)
)
image = torch.randn(1, 3, 32, 32)
output = net(image)
print(output)
torch.Size([1, 16, 5, 5])
torch.Size([1, 400])
torch.Size([1, 120])
tensor([[-0.1083,  0.0951,  0.0376, -0.0808,  0.0035,  0.0367,  0.0273,  0.1101,-0.1449,  0.0607]], grad_fn=<AddmmBackward0>)

通过代码的输出结果我们可以知道,第一个全连接层将[1, 16, 5, 5]展平成了[1, 400]的形状,第二个全连接层展平成了[1, 120]的形状,第三个全连接层展平成了[1, 84]的形状,最后输出层展平成了[1, 10]的形状。这样的输出就可以用来解决10分类问题。

借鉴文章:
CNN

CNN

全连接层

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盘一盘接口测试的那些痛点,你现在会解决了吗

前言 说到接口测试&#xff0c;想必大家一定不会陌生。接口测试就是测试系统组件间&#xff0c;接口对接是否顺畅的一种测试。包括测试数据能否交换、能否传递、能否正常控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系&#xff0c;等等。 由于接口测试主要是检测系统…

2024网络安全面试问题宝典(4万字)

2024网络安全厂商面试问题宝典(4万字) 目录 评分标准网络基础问题 TCP建立连接要进行3次握手&#xff08;syn-syn&#xff0c;ack-ack&#xff09;&#xff0c;而断开连接要进行4次&#xff08;fin-ack-fin-ack&#xff09;TCP&#xff0c;UDP区别&#xff1a;安全常用的协议…

数据库基础--MySQL多表查询之联表查询

联表查询 定义&#xff1a;多张表联合在一起查询&#xff0c;例如学生信息与学生班级表、部门与员工表 创建两张表&#xff0c;主表与从表 CREATE TABLE TestMain(id INT Not NULL AUTO_INCREMENT,nameVARCHAR(10),introduction VARCHAR(255),PRIMARY KEY(id) ); CREATE TAB…

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…

select,poll,epoll

在 Linux Socket 服务器短编程时&#xff0c;为了处理大量客户的连接请求&#xff0c;需要使用非阻塞I/O和复用&#xff0c;select&#xff0c;poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…

ROS 2边学边练(43)-- 利用GTest写一个基本测试(C++)

前言 在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;gtest&#xff08;Google Test&#xff09;是一个广泛使用的C测试框架&#xff0c;用于编写和执行单元测试。这些测试可以验证ROS节点、服务和消息等的正确性和性能。 如果我们需要在写的包中添加测试&…

kubectl_入门_service详解

Service 我们知道 Pod 的生命周期是有限的。可以用 ReplicaSet 和Deployment 来动态的创建和销毁 Pod&#xff0c;每个 Pod 都有自己的 IP 地址&#xff0c;但是如果 Pod 重建了的话那么他的 IP 很有可能也就变化了。 这就会带来一个问题&#xff1a;比如我们有一些后端的 Po…

Flink时间语义 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

【基于MAX98357的Minimax(百度)长文本语音合成TTS 接入教程】

【基于MAX98357的Minimax&#xff08;百度&#xff09;长文本语音合成TTS 接入教程】 1. 前言2. 先决条件2.1 硬件准备2.2 软件准备2.3 接线 3. 核心代码3.1 驱动实现3.2 代码解析 4. 播放文本5. 结论 视频地址&#xff1a; SeeedXIAO ESP32S3 Sense【基于MAX98357的Minimax&am…

redis中的双写一致性问题

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别&#xff0c;你真的知道吗&#xff1f; 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要环节&#xff0c;显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要…

Linux字符设备驱动-详解与实操:驱动架构、设备树、Pinctrl子系统和GPIO子系统、platform、设备树下的platform

如何编写一个驱动程序&#xff1a; &#xff08;1&#xff09;确定主设备号 &#xff08;2&#xff09;定义自己的file_operations结构体&#xff1a; 包含对应的open(drv_open)/read(drv_read)等设备操作函数&#xff0c;需要到内核中去注册 &#xff08;3&#xff09;实现…

【微服务】服务保护(通过Sentinel解决雪崩问题)

Sentinel解决雪崩问题 雪崩问题服务保护方案服务降级保护 服务保护技术SentinelFallback服务熔断 雪崩问题 在微服务调用链中如果有一个服务的问题导致整条链上的服务都不可用&#xff0c;称为雪崩 原因 微服务之间的相互调用&#xff0c;服务提供者出现故障服务的消费者没有…

与Apollo共创生态:让智驾技术为各行业发展赋能

目录 一、引言 二、Apollo七周年大会主要内容回顾 2.1活动回顾链接 2.2Apollo项目介绍 2.2.1Apollo项目发展介绍 2.2.2实验用车传感器介绍 2.2.3硬件连接概述 2.2.4软件概述 2.3Apollo X 企业自动驾驶解决方案介绍 2.3.1Apollo X 企业自动驾驶解决方案优势 2.3.2 Ap…

报错(已解决):无法加载文件 D:\code\NodeJs\pnpm.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; 在vscode运行uniapp项目需要拉取全部依赖&#xff0c;需要使用到pnpm&#xff0c;在vscode终端运行命令&#xff1a;pnpm install后报错&#xff1a; 解决办法&#xff1a; 1&#xff1a;我未安装pnpm&#xff0c;首先打开电脑cmd&#xff0c;运行下列命令&a…

2024中国(江西)国际先进陶瓷材料及智能装备博览会

2024中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会 “中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会” 陶瓷三新展 &#xff08;新材料、新装备、新技术&#xff09; 绿色智能、引领未来 2024年11月1日-11月3日 中国江西 南昌…

初识指针(2)<C语言>

前言 前文介绍完了一些指针基本概念&#xff0c;下面介绍一下&#xff0c;const关键字、指针的运算、野指针的成因以及避免&#xff0c;assert函数等。 目录 const&#xff08;常属性&#xff09; 变量的常属性 指针的常属性 指针的运算 ①指针 -整数 ②指针-指针 ③指针与…

浅析扩散模型与图像生成【应用篇】(二十一)——DALLE·2

21. Hierarchical Text-Conditional Image Generation with CLIP Latents 该文提出一种基于层级式扩散模型的由文本生成图像的方法&#xff0c;也就是大名鼎鼎的DALLE2。在DALLE2之前呢&#xff0c;OpenAI团队已经推出了DALLE和GLIDE两个文生图模型了&#xff0c;其中DALLE是基…

Costas-Barker序列模糊函数仿真

文章目录 前言一、Costas 序列二、Barker 码三、Costas-Barker 序列模糊函数仿真1、MATLAB 核心代码2、仿真结果①、Costas-Barker 模糊函数图②、Costas-Barker 距离模糊函数图③、Costas-Barker 速度模糊函数图 四、资源自取 前言 Costas 码是一种用于载波同步的频率调制序列…

(读书笔记-大模型) LLM Powered Autonomous Agents

目录 智能体系统的概念 规划组件 记忆组件 工具组件 案例研究 智能体系统的概念 在大语言模型&#xff08;LLM&#xff09;赋能的自主智能体系统中&#xff0c;LLM 充当了智能体的大脑&#xff0c;其三个关键组件分别如下&#xff1a; 首先是规划&#xff0c;它又分为以下…