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.mzph.cn/pingmian/7132.shtml

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

相关文章

Python安装以及环境配置

目录 一、下载安装包二级目录三级目录 一、下载安装包 方式网址Python官网python.org镜像下载地址Download pythonpycharmDownload PyCharm https://blog.csdn.net/sun80760/article/details/135256627 二级目录 三级目录

认识ansible 了解常用模块

ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。是自动化运维工具&#xff0…

机器人操作系统ROS2学习 1

随着智能化时代的进程&#xff0c;机器人也在向着高度智能化的方向发展&#xff0c;这对应的机器人操作系统也就相应而生了。机器人操作系统ROS (Robot Operating System)的诞生为机器人系统的开发与应用带来了很大方便&#xff0c;也聚集了全球大量的应用开发人员推动ROS的发展…

hadoop学习---基于Hive的数仓搭建增量信息拉链表的实现

拉链表就是SCD2&#xff0c;它的优点是即满足了反应数据的历史状态&#xff0c;又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段&#xff1a; start_time(表示该条记录的生命周期开始时间——周期快照时的状态)end_time(该条记录的生命周期结束时…

Python项目实战,用Python实现2048游戏

目录 写在前言项目介绍项目思路环境搭建项目实现初始化Python类初始化游戏窗口定义游戏棋盘和方块移动和合并游戏主循环 进一步探索 写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎…

在2G到4g小区重选过程中,4g频点没有优先级信息,最后UE无法重选到4g,是否正常?

这个确实是老问题了&#xff0c;要翻开GSM 的协议找答案。 GSM cell reselection算法分为cell ranking based和priority based两种方式。cell ranking based 只能从GSM重选到UTRAN&#xff1b;而priority based则可以重选到UTRAN和EUTRA。 根据priority based重选算法的描述&am…

Flink窗口理论到实践 | 大数据技术

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

数据库原理与应用实验三 嵌套查询

实验目的和要求 加深和掌握对嵌套查询的理解和应用 实验环境 Windows10 SQLServer 实验内容与过程 图书&#xff08;书号&#xff0c;书名&#xff0c;价格&#xff0c;出版社&#xff09; 读者&#xff08;卡号&#xff0c;姓名&#xff0c;年龄&#xff0c;所属单位&a…

Vue 基础语法

【1】模板语法 &#xff08;1&#xff09;差值表达式 {{}}是 Vue.js 中的文本插值表达式。 它用于在模板中输出数据或表达式的值。当数据或表达式的值发生变化时&#xff0c;插值表达式会自动更新。 补充&#xff1a;三目运算符 它的基本语法是 Condition ? A : B&#xff0…

一起了解开源自定义表单的优势表现

随着社会的进步和科技的发展&#xff0c;越来越多的中小企业希望采用更为先进的软件平台&#xff0c;助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野&#xff0c;成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研…

鸿蒙内核源码分析(原子操作篇) | 谁在为原子操作保驾护航

基本概念 在支持多任务的操作系统中&#xff0c;修改一块内存区域的数据需要“读取-修改-写入”三个步骤。然而同一内存区域的数据可能同时被多个任务访问&#xff0c;如果在修改数据的过程中被其他任务打断&#xff0c;就会造成该操作的执行结果无法预知。 使用开关中断的方…

更适合宝妈和上班族的兼职,每天2小时收入250+的微头条项目

许多人通过撰写微头条赚取收入&#xff0c;但这通常需要自己寻找素材&#xff0c;然后逐字逐句地进行改编创作&#xff0c;整个过程既繁琐又低效。 然而&#xff0c;如今全球范围内的AI工具正如雨后春笋般涌现。百度推出了文心一言&#xff0c;阿里巴巴推出了AI工具通义千问&a…

JavaSE_抽象类(抽象类概念、语法、、特性、作用)

前言 在上一节中&#xff0c;我们讲解了JAVA中的继承&#xff0c;在本节讲解java中抽象类与接口&#xff0c;这个在程序设计中是非常重要的。 一、什么是抽象类 1.1 抽象类概念 基本概念&#xff1a; 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0…

动态规划——背包问题(01,完全,多重)

一、01背包问题 1.题目描述 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。输出最大价值。 01背包问题特点&…

客户管理软件排行榜:对比18款CRM

本文将对比18个客户管理软件&#xff1a;纷享销客、Zoho CRM、Salesforce、HubSpot CRM、Pipedrive、Freshsales、Microsoft Dynamics 365 CRM、Insightly CRM、Nimble CRM、Apptivo CRM、SugarCRM、白码CRM、简信CRM、销帮帮CRM、Teamface企典CRM、神州云动CRM、悟空CRM、八百…

由于找不到msvcp120.dll,无法继续执行代码的5种解决方法

在操作计算机的过程中&#xff0c;您或许会遇到这样一种情形&#xff1a;当试图启动某个软件应用程序时&#xff0c;系统突然弹出一个错误提示框&#xff0c;明确指出“找不到msvcp120.dll”&#xff0c;它会导致程序无法正常启动或运行。为了解决这个问题&#xff0c;我总结了…

OpenNJet:云原生技术中的创新者与实践者

目录 引言OpenNJet介绍OpenNJet优势1. 性能无损动态配置2. 灵活的CoPilot框架3. 支持HTTP/34. 支持国密5. 企业级应用6. 高效安全 OpenNJet 编译与安装环境准备编译环境配置配置yum源yum 安装软件包创建符号连接修改 ld.so.conf 配置 编译代码 部署 WEB SERVER配置OpenNJet部署…

HCIP-Datacom-ARST必选题库_BGP【道题】

1.关于summary automatic命令和BGP聚合的描述,错误的是? 该命令用于实现自动聚合,其优先级高于手动聚合 配置该命令后,BGP将按自然网段聚合路由 该命令用来使能对本地引入的路由进行自动聚合 配置该命令后,BGP只向对等体发送聚合后的路由 1.关于summary automatic命令和BGP聚…

Vue入门到关门之Vue3项目创建

一、vue3介绍 1、为什么要学习vue3&#xff1f; vue3的变化&#xff1a; 首先vue3完全兼容vue2&#xff0c;但是vue3不建议用vue2的写法&#xff1b;其次&#xff0c;vue3拥抱TypeScript&#xff0c;之前vue2使用的JavaScript&#xff0c;ts完全兼容js 最后之前学的vue2 是…

(数据分析方法)长期趋势分析

目录 一、定义 二、目的 三、方法 1、移动平均法 (1)、简单移动平均法 (2)、加权移动平均法 (3)、指数平滑法 2、最小二乘法 3、线性回归 1、数据预处理 2、观察数据分布建立假设模型 3、定义损失函数 4、批量梯度下降 5、优化 4、LSTM 时序分析 5、特征工程 一…