当前位置: 首页 > news >正文

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

上篇文章,我们理解了我们程序的神经网络设计,这篇我们继续,把训练迭代过程分析一下,完成这两篇文章,下面问题,应该能回答了。

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

一、上篇完成网络设计后,神经网络如何训练,自优化的?

回到程序【如需解读,请参阅从0到1,AI我来了- (2)解读程序-从AI手写数字识别开始】

for epoch in range(num_epochs):  running_loss = 0.0  correct = 0  total = 0  for images, labels in train_loader:  optimizer.zero_grad()  outputs = model(images)  loss = criterion(outputs, labels)  loss.backward()  optimizer.step()  running_loss += loss.item()  _, predicted = torch.max(outputs.data, 1)  total += labels.size(0)  correct += (predicted == labels).sum().item()  avg_loss = running_loss / len(train_loader)  accuracy = 100 * correct / total  # 记录到 TensorBoard  writer.add_scalar('Loss/train', avg_loss, epoch)  writer.add_scalar('Accuracy/train', accuracy, epoch)  # 记录到列表  loss_values.append(avg_loss)  accuracy_values.append(accuracy)  print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}, Accuracy: {accuracy:.2f}%')  writer.close() 

这里做了10次训练,每次迭代训练会经过:

         forward(前向传播)--》计算损失 --》backward(反向传播) --》更新权重

forward

        前篇提到了,定义网络模型时,有个函数forword。

forward通常是指一个模型的前向传播过程,它的主要作用是计算输入数据通过网络时的输出,即这里的输入数据图片到输出数字概率的过程。

  outputs = model(images)  

程序中,这句代码,实际就是会调用SimpleCNN 的forward的方法,输入是图片,输出的是概率结果。

计算损失Loss


criterion = nn.CrossEntropyLoss() 
...
loss = criterion(outputs, labels)  

torch.nn模块提供了多种常用的损失函数,这些损失函数可以用于不同类型的机器学习任务。附录一,有一些主要的损失函数,这里是个多分类问题,所以nn.CrossEntropyLoss 可以满足我们要求。

那CrossEntropyLoss 是如何计算损失的?

CrossEntropyLoss 结合了 softmax 函数和负对数似然损失(Negative Log Likelihood Loss)

大白话就是模型会跑出一些结果,比如[1.0,2.0,7.0],这里表示7.0的可能性最大,CrossEntropyLoss 会先把这些分数转化为概率,即把这些值变为0~1之间的值,且和为1。[1.0,2.0,7.0] 转化为[0.1,0.2,0.7]。

backward 反向传播

 loss.backward()  

非常关键的一行代码,简单理解就是,为了追求更小的损失,自动优化模型参数,不断迭代。

原理尝试解读一下,网上找了个图,解释一下:

损失函数L(w),随机指定权重,偏置(bias,随机标量),比如图中的W0哪个点,为了让损失更小(找到波谷),需要对w求导,即寻找W0点的切线。

如果切线斜率为负(如下图,w越大,Loss越小),说明应该增加w的值,也就是会自动根据学习率,更新w的值。

如果切线斜率为正(w越大,Loss 越大),说明梯度应该减少w的值。

更新权重

    optimizer.step()  

在计算出梯度后,我们需要根据这些梯度更新模型的参数。这里使用的优化器(optimizer)将会在调用 optimizer.step() 时生成参数的更新。

optimizer.step()  会更新哪些参数?

在调用 optimizer.step() 时,所有在优化器中注册的参数(即 model.parameters() 返回的那些)都会被更新。

参数类型,包括哪些?

在深度学习模型中,这些可学习的参数通常包括全连接层(nn.Linear)的权重和偏置、卷积层(nn.Conv2d)的权重和偏置、以及其他层的参数。

综上,那7个问题,应该能基本解答出来了,不往底层算法钻的话,能理解就行了。

下篇,我们我们来实践一个本地智能知识库,把常见的Agent、RAG,向量数据库分析分析。

附录:

一、分类任务
  1. 交叉熵损失 (Cross Entropy Loss):

    • torch.nn.CrossEntropyLoss:用于多类分类问题
    • torch.nn.BCEWithLogitsLoss:用于二分类问题的 logits(未经过 sigmoid)和目标相结合的二元交叉熵损失。
  2. 负对数似然损失 (Negative Log Likelihood Loss):

    • torch.nn.NLLLoss:配合在 LogSoftmax 后使用,适用于多类分类。
  3. KL 散度损失 (KL Divergence Loss):

    • torch.nn.KLDivLoss:用于衡量两个概率分布之间的差异。

回归任务

  1. 均方误差损失 (Mean Squared Error Loss):

    • torch.nn.MSELoss:适用于回归问题,计算预测值和目标值之间的均方差。
  2. 平均绝对误差损失 (Mean Absolute Error Loss):

    • torch.nn.L1Loss:计算预测值和目标值之间的平均绝对差。
  3. Huber 损失:

    • torch.nn.HuberLoss:结合了均方误差和平均绝对误差的特点,对于目标值较大时更为稳健。

其他损失函数

  1. 对比损失 (Contrastive Loss):

    • 自定义损失,一般用于 Siamese 网络。
  2. Triplet Loss:

    • 自定义损失,适用于需保持距离的学习(如人脸识别)。
  3. Focal Loss:

    • 自定义损失,用于处理类别不平衡问题。

相关文章:

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

上篇文章,我们理解了我们程序的神经网络设计,这篇我们继续,把训练迭代过程分析一下,完成这两篇文章,下面问题,应该能回答了。 一张图片,如何被计算机读懂?pytorch 封装的网络&#…...

2024 Java 高分面试宝典 一站式搞定技术面

前言 每年9月和10月,被业界称为“金九银十”,这是人才市场一年中最活跃的时期。此时,企业为了来年的业务扩展,纷纷加大招聘力度,空缺岗位众多,招聘需求集中。同时,初秋的招聘活动也避开酷暑&am…...

MongoDB - 聚合操作符 $eq、$gte、$in、$sum、$avg

文章目录 1. $eq2. $gte3. $in4. $sum5. $avg 1. $eq $eq比较两个值并返回&#xff1a;true &#xff08;当值相等时&#xff09;|false&#xff08;当值不相等时&#xff09; { $eq: [ <expression1>, <expression2> ] }构造测试数据&#xff1a; db.inventory…...

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…...

在appium中,如何通过匹配图片来进行断言?

在Appium中进行图片匹配断言&#xff0c;可以使用OpenCV来实现。以下是使用Appium和OpenCV进行图片匹配断言的示例代码。 首先&#xff0c;需要确保安装了必要的库&#xff1a; pip install opencv-python-headless pip install opencv-python pip install numpy然后&#xf…...

昇思25天学习打卡营第21天|CV-Shufflenet图像分类

打卡 目录 打卡 ShuffleNet 网络介绍 ShuffleNet 模型架构 Pointwise Group Convolution Channel Shuffle ShuffleNet模块 ShuffleNet 模块代码 构建ShuffleNet网络 模块代码 模型训练和评估 模型训练 模型评估 模型预测 ShuffleNet 网络介绍 ShuffleNetV1是旷视科…...

python 图片转文字、语音转文字、文字转语音保存音频并朗读

一、python图片转文字 1、引言 pytesseract是基于Python的OCR工具&#xff0c; 底层使用的是Google的Tesseract-OCR 引擎&#xff0c;支持识别图片中的文字&#xff0c;支持jpeg, png, gif, bmp, tiff等图片格式 2、环境配置 python3.6PIL库安装Google Tesseract OCR 3、安…...

SSRF (服务端请求伪造)

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…...

SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN

在SQL中&#xff0c;JOIN操作是连接两个或多个数据库表&#xff0c;并根据两个表之间的共同列&#xff08;通常是主键和外键&#xff09;返回数据的重要方法。其中&#xff0c;LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;和INNER JOIN…...

[网鼎杯 2020 朱雀组]Nmap(详细解读版)

这道题考察nmap的一些用法,以及escapeshellarg和escapeshellcmd两个函数的绕过&#xff0c;可以看这里PHP escapeshellarg()escapeshellcmd() 之殇 (seebug.org) 两种解题方法&#xff1a; 第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入we…...

【React】详解“最新”和“最热”切换与排序

文章目录 一、基本概念和初始化二、切换与排序功能的实现1. 函数定义和参数2. 设置活动 Tab3. 定义新列表变量4. 根据排序类型处理列表4.1 按时间降序排序4.2 按点赞数降序排序 5. 更新评论列表 三、渲染导航 Tab 和评论列表1. map 方法2. key 属性3. className 动态赋值4. onC…...

BUUCTF [MRCTF2020]Ezpop

这道题对于刚接触到pop链的我直接把我整懵了&#xff0c;一边看着魔术方法一边分析 魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程&#xff0c;简单编程 (twle.cn) 代码解析 经过以上的分析我们可以理一下解题思路&#xff1a;接收参数反序列化之前先触发…...

RV1126 Linux 系统,接外设,时好时坏(一)应该从哪些方面排查问题

在 Linux 系统中接外设时,遇到“时好时坏”的问题,可能是由多种因素引起的。以下是一些排查问题的建议。 1. 硬件方面的排查 1.1 连接检查 物理连接: 确保外设与主板之间的连接良好,检查插头、插座及线缆是否牢固。引脚配置: 确认设备树中引脚的配置是否正确,尤其是引脚…...

Vue实现简单小案例

一、创建文件夹 二、引用vue.js <script src"../js/vue.js"></script> 三、准备一个容器 <div id"app"><h1>Hello,{{name}}</h1> </div> 四、创建实例 <script>new Vue({el:"#app", //el用于指…...

【MATLAB APP】建立独立桌面APP

背景&#xff1a;已有MATLAB APP的.mlapp文件&#xff0c;但客户提出需要可以直接使用的exe文件。 要求&#xff1a;点开即用&#xff0c;无需下载MATLAB。使用者无法修改APP的代码。 一、环境配置 APP创建者&#xff1a;安装MATLAB R2023a&#xff0c;配置Application Compile…...

Spring的优缺点?

Spring的优缺点 直接回答相关的Spring的特点&#xff1a; IOC AOP 事务 简化开发&#xff1a; 容易集成JDBCTemplateRestTemplate&#xff08;接口远程调用&#xff09;邮件发送相关异步消息请求支持 更加深入就讲源码了 优点&#xff1a; 方便解耦&#xff0c;简化开发…...

第一百八十三节 Java IO教程 - Java目录事件、Java异步I/O

Java IO教程 - Java目录事件 当文件系统中的对象被修改时&#xff0c;我们可以监听watch服务以获取警报。 java.nio.file包中的以下类和接口提供watch服务。 Watchable接口WatchService接口WatchKey接口WatchEvent接口WatchEvent.Kind接口StandardWatchEventKinds类 可监视对…...

【设计模式】(万字总结)深入理解Java中的创建型设计模式

1. 前言 在软件开发的世界里&#xff0c;设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计&#xff0c;更是对问题的思考和解决的方法论。在Java开发中&#xff0c;特别是在面向对象的编程中&#xff0c;设计模式尤为重要。创建型设计模式&#xff0c;作为设…...

【全面讲解下Docker in Docker的原理与实践】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👉目录 👉前言👉原理👉实践👉安全和最佳实践👉前言 🦛…...

Android Settings增加多击事件,增加开发者模式打开难度

软件平台&#xff1a;Android11 硬件平台&#xff1a;QCS6125 需求来源&#xff1a;用户通过系统异常崩溃&#xff0c;进入原生Settings页面&#xff0c;通过默认的多击版本号方式打开开发者模式&#xff0c;继而打开adb调试开关&#xff0c;安装三方apk。 对付这种需求本来有…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...