从0到1,AI我来了- (3)AI图片识别的理论知识-I

news2024/11/24 2:13:37

从上篇文章,我们分析通过Pytorch 封装的各种方法,解读了一遍图片识别训练到测试的流程。

这篇我们从理论上,理解下,图片是如何被识别的?

核心需要理解的内容有?

  1. 一张图片,如何被计算机读懂?
  2. pytorch 封装的网络,什么是卷积层,为什么要多层?层与层如何衔接?如何设计?
  3. 什么是池化?为什么要池化?
  4. 什么是全链接层?它有什么作用?
  5. 神经网络模型的前向传播?这个步骤的作用是什么?
  6. 什么梯度下降?梯度下降的价值?
  7. 什么是激活函数?为什么要用激活函数?

带着问题,我们找个教程看看:

一、初识图片识别过程

我们先理解上图,再结合我们自己的例子加深下理解。

MNIST上,下载的手写训练数字数据,也跟上面的INPUT一样,是一个28*28像素的图片

整个图片处理过程:

INPUT--》Conv_1--》Max-Pooling(1) --》Conv_2 --》Max-Pooling(2) -》全链接(full connected ReLU激活函数)-》全连接(with dropout)--》得出(0~9)每个数的概率值

Conv_1

没有经过padding(补充)、Stride(移动步长) 为1,n1 个通道(可以理解为特征,彩色图片,一般为RGB,3个通道),卷积核为5*5,也就就是INPUT中虚线的格子,经过从到右(每次格子移动1个像素),经过卷积层后,单通道变为了n1@24*24,即n1个图片大小为24*24 的图片(如下计算),

Max-Pooling(1)

max-pooling 2*2 可以理解为一个长*宽 为2的格子(如 n1 channels 24*24中的格子图);

把4(2*2)个像素的格子,经过平均/最大值计算,n1*24*24, 池化后,长24/2后为12,即变为第三幅图(n1 channels 12*12*n1)

Conv_2 

没有经过padding(补充)、Stride(移动步长) 为1,n2 个通道,卷积核为5*5,

卷积后大小为:  (12-5+2*0)/1 +1 = 8,经过 卷积层conv_2 ,n2@8*8

Max-Pooling(2)

max-pooling 2*2 可以理解为一个长*宽 为2的格子,池化后变为 n2@4*4;

fc_3 Full Connected 

输入为:n2@4*4 ,把特征图展平,为n2个16个一维的向量(数组)

ReLU activation ReLU激活函数 ReLU(x)=max(0,x),即小于0为的经过函数,输出为0,大于0的,为数本身。

fc_4 Full Connected 

(提到了Dropout ,补充到附录了,先不了解也没啥问题)

要把10个数字,最终拿到每个数字的概率值,那这层输出层通道数必须为10,且数据要控制在概率和为1。

所以这里应该会经过这么个环节的,pytorch中,criterion = nn.CrossEntropyLoss()

nn.CrossEntropyLoss 在内部会自动应用 Softmax 激活函数,所以你只需将 logits(模型输出)和标签传递给它。】

我们解读了手写图片,经过神经网络后,输出的概率过程,接下来,我们结合我们自己的程序分析一下。

二、理解我们的程序网络

回顾我们代码如下:

输入为:28*28的原始图片

conv1  

self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)

定义一个神经网络层conv1,该层特点:2维的 输入为1个通道、输出为32个通道,卷积核为3*3,步长为1,补充为1

长=(28-3+2*1)/1 + 1 = 28,

即根据公式,经过conv1 后特征图为:32@ 28*28 ,特征图大小没变

conv2

self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)

定义一个神经网络层conv2,该层特点,conv1要衔接conv2,那么conv1的输出,是conv2的输入,即conv2的输入也为32.

卷积层conv2,为2维的,输入为32,输出为64 通道,卷积核为3,步长为1,补充为1

即根据公式,经过conv2后特征图为:64@ 28*28 ,特征图大小没变

Max-pooling 

self.pool = nn.MaxPool2d(2, 2)  

定义了池化,max pool 把4个像素中最大的标量,作为最终一个像素的标量值;还有一个常见的平均池化,即4个像素相加的平均值,作为最终一个像素的标量。

fc1

self.fc1 = nn.Linear(64 * 7 * 7, 128)  

定义一个全连接层fc1,输入为64*7*7,即conv2后64*28*28,需要经过2次池化操作;输出为128

fc2

self.fc2 = nn.Linear(128, 10) 

定义一个全链接层fc2,输入是fc1的输出大小,128,输出是10,即输出10个数字的概率值

OK,这篇先到这,我们理解了我们的网络如何连接的,下篇分析如何训练。

附录:

fc_3 Full Connected 图中提到了dropout,它是啥?

即防止过拟合问题,啥是过拟合,后面再补,如果dropout 比例为0.5,经过 ReLU 激活后,得到的 24*24 特征图在应用 Dropout 后,尺寸保持不变,仍然是 24×24,但激活值中大约有一半的值会被置为 0)

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

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

相关文章

探索 Python 异步编程的利器:gevent 库

探索 Python 异步编程的利器:gevent 库 第一部分:背景介绍 在现代的软件开发中,异步编程模式因其在处理 I/O 密集型任务时的高效率而越来越受到重视。Python,作为一种动态、解释型的高级编程语言,其原生的异步编程支持…

如何判断IP是否属于网段10.134.208.0/20

首先想要判断IP是否属于网段,我们首先需要了解IP地址的组成结构: 网络IP地址的划分主要包括网络部分(网络地址)和主机部分,以及一个特殊的地址——广播地址。以下是详细的划分说明: 一、IP地址的组成 每…

中国式浪漫的源头之一:《楚辞》

文章目录 引言亦余心之所善兮,虽九死其犹未悔。惟草木之零落兮,恐美人之迟暮。沧浪之水清兮,可以濯吾缨。悲莫悲兮生别离,乐莫乐兮新相知。苟余心之端直兮,虽僻远其何伤。孰无施而有报兮,孰不实而有获?尺有所短,寸有所长。引言 楚辞中表里俱佳的文字,很有启发性。楚辞…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com.

问题 今天jenkins打包一个项目,发现报错了 error An unexpected error occurred: "https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com". 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmi…

linux驱动--中断

中断号和中断的申请 中断号的添加-----定义设备节点,描述当前设备 通过设备树文件获取 /dts/xxxx.dts文件中进行设备的设置 在dts设备树文件中进行设备的定义,包括继承的设备,中断号的设置 需要对我们的dts设备树文件进行编译&#xff0…

Flink Doirs Connector 常见问题:Doris目前不支持流读

常见问题 Doris Source 在数据读取完成后,流为什么就结束了? 目前 Doris Source 是有界流,不支持 CDC 方式读取。 问题:对于 Flink Doris DataStream,Flink 想要在 流式读取 Doirs / 实时读 Doris,目前读…

网页的相关概念

什么是网页 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一页,通常是 HTML 格式的文件,需通过浏览器来阅读。 网页是构成网站的基本元素,通常由图片、链接、文字、声…

MySQL表的增删查改(3)——复杂情况

1. 表的设计 三大范式: 一对一:如一个学生可以有一个学号,一个学号只能被一个学生拥有 一对多:如一个学生只能属于一个班级,但一个班级可以有多个学生(这种方案在MySQL中是不可行的,但在有些…

深入浅出mediasoup—关键帧请求

当丢包或者解码错误导致无法正确解码视频流,或者当一个新的接收者加入到视频通话时,需要一个关键帧来恢复和开始正常解码。关键帧请求机制是确保视频流在不可靠网络环境下能够恢复和维持高质量播放的关键技术之一,mediasoup 支持关键帧请求。…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法,不过多介绍,是基于深度学习的目标检测算法中最出名、发展最好的检测器,没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程,详细技术细节不过多介绍,只提及改进点,适合初学者…

每日OJ_牛客_HJ91 走方格的方案数

目录 牛客HJ91 走方格的方案数 解析代码 牛客HJ91 走方格的方案数 走方格的方案数_牛客题霸_牛客网 解析代码 本题为求取路径总数的题目,一般可以通过递归求解,对于复杂的问题,可以通过动态规划求解。此题比较简单,也可以通过递…

AI学习记录 - transformer的位置编码的理解

看完肯定懂,可能会更新 一看位置编码公式,感觉很懵逼 懵逼四点:(或者你还有其他不懂的点) 1、为什么使用正弦余弦公式?不可以使用其他公式? 2、为什么奇数位置使用余弦,偶数位置使…

向量数据库:从0到original paper

向量数据库相关概念 亿点点历史知识 LLM的模型发展历史,Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond1: 很多人都是从ChatGPT爆点后才逐渐了解到大模型,但在爆点的前几年大模型的发展已经开始了诸神之战。一…

网络服务综合项目(一键部署shell脚本)

目录 需求: 主机环境描述 注意: 项目需求: 代码讲解 配置本地仓库 安装软件包 配置防火墙 配置策略中的一个布尔值 配置web服务 配置网络仓库 配置DNS服务 配置NTP服务 配置MySQL服务 配置NFS服务 配置论坛服务 进入网站配置…

数据结构(稀疏数组)

简介 稀疏数组是一种数据结构,用于有效地存储和处理那些大多数元素都是零或者重复值的数组。在稀疏数组中,只有非零或非重复的元素会被存储,从而节省内存空间。 案例引入 假如想把下面这张表存入文件,我们会怎么做?…

C语言字符函数与字符串函数超详解

文章目录 前言1. 字符分类函数2. 字符转换函数3. strlen3. 1 strlen 的使用3. 2 strlen 的模拟实现 4. strcpy4. 1 strcpy 的使用4. 2 strcpy 的模拟实现 5. strcat5. 1 strcat 的使用5. 2 strcat 的模拟实现 6. strcmp6. 1 strcmp 的使用6. 2 strcmp 的模拟实现 7. strncpy 函…

如何获得某个Window画面所属包名packageName和用户userId

在安卓上获得某个Window画面所属包名packageName和用户userId的方法 1,用到的工具如下: adb androidSDK里的monitor工具 adb shell dumpsys window animator adb shell dumpsys window命令 jdk 1.8已在安卓14模拟器上测试通过。 以AOSP的launcher中的m…

Nacos适配达梦数据库并制作镜像

背景:因项目需要信创,需将原本的mysql数据库,改成达梦数据库 一、部署达梦数据库 1.1 部署达梦数据库服务 可参考:Docker安装达梦数据库_达梦数据库docker镜像-CSDN博客 1.2 创建nacos数据库 create user SAFE_NACOS identifi…

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数: import pygame import time import random 游戏源码: import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

【秋招突围】2024届秋招笔试-美团笔试题-第一套-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新 美团 春秋招笔试题**汇总~ 👏 感谢大家的订阅➕ 和 喜欢💗 01.LYA 的音乐播放列表 问题描述 LYA 有一个包含 n n n 首歌曲的音乐播放列表,歌曲编号从 1 1