基于多层感知机(MLP)实现MNIST手写体识别
实现步骤
- 下载数据集
- 处理好数据集
- 确定好模型(初始化模型参数等等)
- 确定优化函数(损失函数也称为目标函数)和优化方法(一般选用随机梯度下降 SDG )
- 进行模型的训练
- 进行模型的评估
import torch
import torchvision
from torch import nn
from torch import optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
import matplotlib.pyplot as plt# 1. 下载数据集
mnist_train = torchvision.datasets.MNIST(root='../data', train=True, transform=transforms.ToTensor(), download=True)
mnist_test = torchvision.datasets.MNIST(root='../data', train=False, transform=transforms.ToTensor(), download=True)# 2. 创建批量数据迭代器
train_iter = DataLoader(mnist_train, batch_size=256, shuffle=True)
test_iter = DataLoader(mnist_test, batch_size=256)# 3. 可视化检查数据
var = next(iter(train_iter))
plt.title(str(var[1][0])) # 显示标签
plt.imshow(var[0][0].squeeze().numpy(), cmap='gray') # 显示图片
plt.show()# 4. 定义模型:多层感知机
net = nn.Sequential(nn.Flatten(),nn.Linear(28 * 28, 512),nn.ReLU(),nn.Linear(512, 256),nn.ReLU(),nn.Linear(256, 10) # 注意这里是不需要加 Softmax 了的,因为后面定义了,nn.CrossEntropyLoss()这个会自动帮我们进行 Softmax 以及进行损失计算。其实就是目标函数
)# 初始化模型参数
def init_weights(m):if isinstance(m, nn.Linear):nn.init.normal_(m.weight, std=0.01)net.apply(init_weights)# 5. 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss() # CrossEntropyLoss已经包含了softmax,所以不需要LogSoftmax
optimizer = optim.SGD(net.parameters(), lr=0.2)# 6. 训练模型
epoch_num = 20
for epoch in range(epoch_num):net.train() # 设置为训练模式total_loss = 0for X, y in train_iter:optimizer.zero_grad() # 清除梯度y_hat = net(X) # 前向传播loss = loss_fn(y_hat, y) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数total_loss += loss.item() * X.shape[0] # 累积损失avg_loss = total_loss / len(mnist_train) # 计算平均损失print(f'Epoch {epoch + 1}/{epoch_num}, Loss: {avg_loss:.4f}')# 7. 评估模型
def evaluate_model(net, test_iter):net.eval() # 设置为评估模式correct, total = 0, 0with torch.no_grad(): # 在评估时不需要计算梯度for X, y in test_iter:y_hat = net(X)_, predicted = torch.max(y_hat, 1) # 获取预测的标签correct += (predicted == y).sum().item() # 统计正确的个数total += y.size(0) # 统计总数accuracy = correct / totalprint(f'Accuracy on test set: {accuracy * 100:.2f}%')# 评估模型的表现
evaluate_model(net, test_iter)
代码实践的结果:
- 自己不会去计算损失
- 在模型进行训练的时候不知道如何把数据放进去:原来只需要创建好了 DataLoader 以后,通过枚举
就可以拿到数据了。- 最后进行模型评估的时候也是用 AI 进行完成了。所以多少还是差点意思。
- 后面的代码多去实践实践,并且思考吧!!!
关于代码中交叉熵计算的理解
理解损失函数(loss_fn
)是如何计算的,对于训练神经网络来说是非常重要的。具体到你提到的这行代码:
loss = loss_fn(y_hat, y) # 计算损失
损失函数的定义:
在你的代码中,损失函数是:
loss_fn = nn.CrossEntropyLoss()
nn.CrossEntropyLoss()
是一种常用于多分类问题的损失函数,它实际上包含了两个步骤:
- Softmax:将模型的输出转换为概率分布。
- 交叉熵损失:计算真实标签与预测概率分布之间的差距。
为什么要用交叉熵呢?因为交叉熵可以来衡量预测差距,这个我们只需要这个知识点,并且知道上面的公式就好了。
我们逐步分析这两个步骤。
1. Softmax(概率转换)
假设模型的输出 y_hat
是一个向量,其中每个元素代表对应类别的“分数”(或者说是原始的 logits)。例如,假设有 3 个类别,模型的输出可能是:
y_hat = [2.0, 1.0, -1.0] # 这三个数字是 logits,不是概率
通过 Softmax 函数,我们将这些 logits 转换成概率:
# 计算 softmax
softmax = torch.nn.functional.softmax(y_hat, dim=-1)
softmax
的输出会是一个概率分布,每个数值的范围在 [0, 1] 之间,且所有数值加起来为 1。例如,经过 Softmax 后可能得到:
softmax = [0.7, 0.2, 0.1] # 类别 0 的概率是 0.7,类别 1 的概率是 0.2,类别 2 的概率是 0.1
2. 交叉熵损失(Cross Entropy Loss)
交叉熵是衡量两个概率分布之间差异的一个标准方法。在分类任务中,我们希望预测的类别概率与真实标签分布尽可能接近。
对于一个单一的样本,交叉熵损失的计算公式为:
L = − ∑ i = 1 C y i log ( p i ) L = - \sum_{i=1}^{C} y_i \log(p_i) L=−i=1∑Cyilog(pi)
- ( C ) 是类别数。
- ( y_i ) 是真实标签(在 one-hot 编码下,真实类别的标签为 1,其他类别为 0)。
- ( p_i ) 是模型预测的概率。
对于多分类任务来说,交叉熵损失会选择对应真实标签的类别概率 ( p_{\text{true}} ) 来计算损失。例如,如果真实标签是类别 0,那么我们只关注模型在类别 0 上的预测概率。
假设真实标签 y
是类别 0,对应的 one-hot 编码是 [1, 0, 0]
,而模型的预测是:
softmax = [0.7, 0.2, 0.1]
那么交叉熵损失为:
L = − ( 1 ⋅ log ( 0.7 ) + 0 ⋅ log ( 0.2 ) + 0 ⋅ log ( 0.1 ) ) = − log ( 0.7 ) ≈ 0.3567 L = - (1 \cdot \log(0.7) + 0 \cdot \log(0.2) + 0 \cdot \log(0.1)) = - \log(0.7) \approx 0.3567 L=−(1⋅log(0.7)+0⋅log(0.2)+0⋅log(0.1))=−log(0.7)≈0.3567
nn.CrossEntropyLoss()
如何工作
在 PyTorch 中,nn.CrossEntropyLoss
会自动处理上述两个步骤:
- 将
y_hat
(logits)转换为概率。 - 使用真实标签
y
计算交叉熵损失。
输入和输出:
y_hat
: 这是模型的原始输出(logits),形状为(batch_size, num_classes)
。每一行是一个样本的 logits。y
: 这是标签,通常是一个包含类别索引的向量,形状为(batch_size,)
。每个元素是该样本的真实类别索引。
例如:
假设我们有以下数据:
-
模型的输出(logits)为:
y_hat = torch.tensor([[2.0, 1.0, -1.0], # 第一个样本[0.5, 1.5, 0.3]]) # 第二个样本
-
真实标签
y
为:y = torch.tensor([0, 1]) # 第一个样本的标签是类别 0,第二个样本的标签是类别 1
使用 nn.CrossEntropyLoss()
计算损失:
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(y_hat, y)
CrossEntropyLoss
会首先对 y_hat
进行 softmax 转换,然后计算每个样本的交叉熵损失。你可以通过打印出来的 loss
来查看模型的表现。
总结:
y_hat
是模型的原始输出(logits),表示每个类别的“分数”。nn.CrossEntropyLoss
会自动处理 softmax 和交叉熵损失的计算。- 损失函数的目的是衡量模型的输出与真实标签之间的差异,差异越小,损失值越小,说明模型的预测越准确。
使用`nn.CrossEntropyLoss 会自动进行独热编码
在计算交叉熵损失时,nn.CrossEntropyLoss
会自动处理标签,并且不需要你手动将标签转换为独热编码(one-hot encoding)。
具体来说:
y_hat
:是模型的原始输出(logits),形状为(batch_size, num_classes)
,每一行是一个样本的预测结果,包含每个类别的分数(logits)。y
:是标签,形状为(batch_size,)
,每个元素是该样本的真实类别的 索引,而不是独热编码。
nn.CrossEntropyLoss
会自动使用标签 y
中的类别索引(如类别 0, 1, 2)来计算损失,它会根据该类别索引选择对应的模型输出进行计算,而不需要你事先将标签转换为独热编码。
举个例子:
假设我们有一个批次的两个样本,模型的输出 y_hat
和真实标签 y
如下:
模型的输出 y_hat
(logits):
y_hat = torch.tensor([[2.0, 1.0, -1.0], # 第一个样本的 logits[0.5, 1.5, 0.3]]) # 第二个样本的 logits
真实标签 y
(类别索引):
y = torch.tensor([0, 1]) # 第一个样本的标签是类别 0,第二个样本的标签是类别 1
在这个例子中,y_hat
的形状是 (2, 3)
,表示有两个样本,每个样本有三个类别的 logits。
- 对于第一个样本,它的真实标签是类别
0
,y[0] = 0
。 - 对于第二个样本,它的真实标签是类别
1
,y[1] = 1
。
当使用 nn.CrossEntropyLoss
时,它会根据真实标签中的类别索引来选择对应的类别概率(通过 softmax 后的结果),然后计算交叉熵损失。PyTorch 会自动完成:
- Softmax 转换:将
y_hat
的 logits 转换为概率分布。 - 损失计算:根据真实标签的类别索引计算交叉熵损失。
损失计算过程:
假设 y_hat
的 softmax 输出(经过 softmax 转换后)为:
softmax = torch.nn.functional.softmax(y_hat, dim=1)# softmax 结果:
# [[0.7, 0.2, 0.1], # 第一个样本的概率
# [0.3, 0.6, 0.1]] # 第二个样本的概率
然后计算交叉熵损失时:
- 对于第一个样本(真实标签是
0
),损失将仅计算softmax[0][0]
(即类别0
的概率),即-log(0.7)
。 - 对于第二个样本(真实标签是
1
),损失将仅计算softmax[1][1]
(即类别1
的概率),即-log(0.6)
。
因此,nn.CrossEntropyLoss
会自动从 y
中提取类别索引,并计算相应的损失。
总结:
- 不需要手动进行独热编码,因为
nn.CrossEntropyLoss
会自动处理。 - 标签
y
只需要是一个包含类别索引的张量(每个元素是一个整数,表示类别)。 nn.CrossEntropyLoss
会根据标签中的类别索引,从y_hat
中提取对应的 logits,然后计算交叉熵损失。
通过这种方式,PyTorch 简化了损失计算的过程,让你不需要显式地进行独热编码的转换。
为什么在实验的时候我去掉了参数初始化对结果并没有很大影响?
在深度学习模型中,尤其是在多层感知机(MLP)中,初始化模型参数对于训练的收敛速度和结果有重要影响。虽然初始化通常有助于提升训练过程的稳定性和准确性,但在某些情况下,即使没有显式初始化,训练仍然可能得到较好的结果。这有以下几个原因:
1. PyTorch 默认的权重初始化
如果你没有手动初始化模型参数,PyTorch 会使用默认的初始化方式。对于 nn.Linear
层,PyTorch 默认使用的是 均匀分布初始化(U(-sqrt(k), sqrt(k))
),其中 k
是每一层的输入特征数(即该层的输入维度)。这种初始化方式通常可以在大部分场景下有效工作,尤其是在简单的任务或小型模型中。
2. 任务本身比较简单
MNIST 数据集是一个相对简单的任务,具有以下特点:
- 样本相对简单(28x28 的灰度图像)。
- 类别数量较少(10 个类别)。
- 数据集规模较小(60,000 个训练样本)。
由于这些原因,即使没有特别优化初始化方式,模型仍然能在训练过程中较好地拟合数据,因此准确率可能不会受到显著影响。
3. 优化器的鲁棒性
现代优化器(如 SGD、Adam 等)通常具有较强的鲁棒性,能够在一定范围内有效地调整模型的参数,避免了初始化差异带来的过度影响。即使没有进行显式初始化,优化器也能够逐步调整模型的参数,从而避免梯度消失或梯度爆炸等问题,保证训练的顺利进行。
4. 训练过程中参数的调整
在模型训练初期,即使初始化不完美,随着训练的进行,网络的权重会在反向传播过程中逐步调整到合适的值。因此,即使开始时的参数较为随机,优化过程仍然能够找到有效的解决方案。这就是深度学习的一个特性:即使参数初始不理想,优化过程通常能通过梯度更新找到合适的解。
5. 初始化不影响最终收敛结果
对于一些简单的任务,模型可能在多个初始化条件下都能够达到一个相对接近的局部最优解。在这种情况下,即使没有手动初始化权重,模型也能收敛到较好的解。
总结:
- 默认初始化(PyTorch 内部的初始化方式)通常已经能在很多简单的任务中有效工作,特别是像 MNIST 这样简单的图像分类任务。
- 优化器的鲁棒性帮助模型调整参数,避免了初始化不完美时对结果产生显著影响。
- 对于 MNIST 这种简单任务,初始化参数的不同可能不会导致显著差异,尤其是在训练的过程中,优化器能够找到较好的解。
然而,在一些更复杂的任务中,初始化的方式会直接影响模型的训练效率和性能。在这些任务中,精心设计的初始化(例如 Xavier、He 初始化等)能够帮助模型更快地收敛并避免训练过程中遇到的问题。
相关文章:
基于多层感知机(MLP)实现MNIST手写体识别
实现步骤 下载数据集处理好数据集确定好模型(初始化模型参数等等)确定优化函数(损失函数也称为目标函数)和优化方法(一般选用随机梯度下降 SDG )进行模型的训练进行模型的评估 import torch import torch…...
windows下安装pyenv+virtualenv+virtualenvwrapper
1、下载pyenv 进入git官网,打包下载zip到本地 2、解压到安装目录 解压下载好的pyenv-win-master.zip到自己的安装目录,如D:\Program Files 3、配置环境变量 右击桌面 此电脑 --> 属性 --> 高端系统设置 --> 环境变量 --> 新建系统变量…...
C# 确保程序只有一个实例运行
常规需求 C#程序只能运行一次,不能多开: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; using System.Security.Principal; namespace BallLocation {sta…...
MySQL 的存储引擎有哪些?它们之间有什么区别?
MySQL 支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。以下是 MySQL 中常见的存储引擎及其主要区别: 1.常见存储引擎及其特点 (1)InnoDB • 事务支持:支持完整的 ACID 特性,适用于需要事务处理的场景。 • 锁机制&…...
大语言模型的评测
大语言模型评测是评估这些模型在各种任务和场景下的性能和能力的过程。 能力 1. 基准测试(Benchmarking) GLUE(General Language Understanding Evaluation):包含多个自然语言处理任务,如文本分类、情感分…...
《从零到全栈:Vue2入门宝典》
1. Vue 简介 1.1 什么是 Vue? Vue 是一套用于构建用户界面的渐进式框架。Vue 的核心库专注于视图层,易于与其他库或现有项目集成。Vue 的目标是通过尽可能简单的 API 实现数据双向绑定和组件化开发。 1.2 什么是“渐进式”? “渐进式”意味…...
next.js-学习3
next.js-学习3 6. 设置数据库1. 传代码到github https://github.com/2. github和Vercel链接,用Vercel预览和部署3. 创建数据库4. 初始化数据库 7.读取数据1. 在/app/lib/data.ts中这两行是连接postgres的2. 在/app/dashboard/page.tsx中使用3.在/app/dashboard/page…...
Hadoop第2课(伪分布式集群的搭建)
jdk和hadoop安装包: hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下(hadoop用户的主目录) 2、解压jdk安装包到~目录 卸载jdk的命令:r…...
Linux——进程池
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 1.实现思路 思路:通过创建匿名管道,来实现父子进程之间的通信 注1:父写,子读 注2:匿名管道只能用来进行具有血管关系的进程…...
JavaScript 简单类型与复杂类型-简单类型的内存分配
深入理解JavaScript中的简单类型(基本数据类型)和复杂类型(引用数据类型)如何在内存中存储对于编写高效、无误的代码至关重要。本文将专注于探讨简单类型的内存分配机制,即栈(Stack)内存&#x…...
深度生成模型(一)——具身智能综述与算法分类简介
具身智能对于机器人的控制可以分为端到端模型和非端到端模型: 端到端模型:具身模型(如 ACT 和 DP)将视觉感知(Vision)与动作生成(Action)整合为单一神经网络,直接实现从…...
Vue 中,使用模板(Template) 和 Render 函数编写组件的区别
在 Vue 2 中,模板(Template) 和 Render 函数 是两种不同的组件编写方式,它们各有特点和适用场景。以下是它们的核心区别和实际应用场景分析: 1. 基本区别 特性模板(Template)Render 函数语法形…...
【笔记】论文阅读方法(AI大模型)
1 为什么读论文 构建知识体系:通过Related Works快速了解该方向研究现状,追踪经典论文 紧跟前沿技术:了解领域内新技术及效果,快速借鉴到自身项目 培养科研逻辑:熟悉论文体系,了解如何创造新事物&#x…...
JWT+redis实现令牌刷新优化方案
令牌刷新优化方案的详细实现步骤: 1. 令牌服务层改造 1.1 JWT工具类增强 // JwtUtils.java 新增方法 public class JwtUtils {// 生成带动态过期时间的令牌public static String createToken(String subject, String userId, String username, long expirationMi…...
安全面试5
文章目录 sql的二次注入在linux下,现在有一个拥有大量ip地址的txt文本文档,但是里面有很多重复的,如何快速去重?在内网渗透中,通过钓鱼邮件获取到主机权限,但是发现内网拦截了tcp的出网流量,聊一…...
vim临时文件泄露
##解题思路 感觉ctfshow的题目都挺有意思的,大家可以去做做 首先题目提示vim临时文件泄露,一般在vim编辑的时候,会有个swp的中间文件生成,根据这个特性,从而可以猜测,我们可以通过访问一个swp文件路径&am…...
使用Docker将ros1自定义消息通过rosjava_bootstrap生成jar包
文章目录 预准备环境rosjava_bootstrap坏消息好消息 环境安装docker安装rosjava_bootstrap仓库rosjava_center仓库修改rosjava_bootstrap代码拉取docker镜像放置自己的自定义消息 启动docker编译 预准备环境 rosjava_bootstrap rosjava_bootstrap是将自定义的ROS消息生成java…...
本地快速搭建一套AI人脸识别技术研究学习的实验环境
如果你想在本地搭建一套学习和研究AI人脸识别技术的框架,建议使用开源工具和框架进行实验,因为它们通常提供了较为丰富的文档和社区支持,能够帮助你深入理解人脸识别的核心原理。以下是一套可行性强且综合性的方案,涵盖了人脸检测…...
SpringBoot项目连接Oracle视图报错整理
在若依框架中增加连接Oracle视图报错 工具测试连接 通过使用plsql连接数据库测试,连接成功 1. 相关配置内容 连接配置 url: jdbc:oracle:thin:192.168.0.210:1521:HIS username: portal_his password: XXXXXX driver-class-name: oracle.jdbc.driver.OracleDr…...
【我的 PWN 学习手札】House of Husk
House of Husk House of Husk是利用格式化输出函数如printf、vprintf在打印输出时,会解析格式化字符如%x、%lld从而调用不同的格式化打印方法(函数)。同时C语言还提供了注册自定义格式化字符的方法。注册自定义格式化字符串输出方法…...
面试-JVM:JVM的组成及作用
JVM包含两个子系统和两个组件: 两个子系统: 类加载子系统(ClassLoader Subsystem) 作用:根据给定的全限定类名(如:java.long.Object)来装载class文件至运行时数据区的方法区。 核心…...
Node.js项目启动流程以及各个模块执行顺序详解
Node.js项目启动流程以及各个模块执行顺序的问题。首先,我需要仔细阅读并理解我搜索到的资料,从中提取关键信息,然后综合这些信息组织成一个结构化的回答。 首先,根据我搜索到的资料都详细描述了Node.js的启动流程,涉及…...
obj离线加载(vue+threejs)+apk方式浏览
demo需求:移动端,实现obj本地离线浏览 结合需求,利用(vue2threejs173)进行obj的加载,然后采用apk方式(hbuilderX打包发布)移动端浏览; https://github.com/bianbian886/…...
【Python 语法】Python 数据结构
线性结构(Linear Structures)1. 顺序存储列表(List)元组(Tuple)字符串(String) 2. 线性存储栈(Stack)队列(Queue)双端队列(…...
Flutter - 布局Widget
Flutter的布局主要分为 单子组件 和 多子组件 两大类: Container、Padding、Align这些属于单子组件,而Row、Column、ListView这些则是多子组件。 单子组件 Align组件 Align 是一个用于控制子组件位置的单子布局组件。它通过指定对齐方式(…...
AD从原理图到PCB超详细教程
AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查⑤…...
视频级虚拟试衣技术在淘宝的产品化实践
作为一种新的商品表现形态,内容几乎存在于手淘用户动线全流程,例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力,能够从供给端缓解内容生产成本高的问题,通过源源不断的低成本供给…...
Redis安装及其AnotherRedisDesktopManagera安装使用
一、Redis安装 1. 下载Redis安装包 通过网盘分享的文件:Redis 链接: https://pan.baidu.com/s/1elAT8mk3EIoYQQ3WoVVoNg?pwd7yrz 提取码: 7yrz 2. 解压Redis安装包 下载完成后,将Redis安装包解压到一个指定的目录,例如:C:\Re…...
2025系统架构师(一考就过):案例之四:架构复用、架构评估、特定架构(DSSA)、架构开发方法(ABSD)
二、软件架构复用 ◆软件产品线是指一组软件密集型系统,它们共享一个公共的、可管理的特性集,满足某个特定市场或任务的具体需要,是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理复用、集成新的系统。 ◆软件架构…...
软件工程应试复习(考试折磨版)
针对学校软件工程考试,参考教材《软件工程导论(第6版)》1-8章 学习的艺术:不断地尝试,我一定会找到高效用的方法,让学习变成一门艺术,从应试备考中解救出我的时间同胞们。 好嘞!既然…...
Kafka可视化工具EFAK(Kafka-eagle)安装部署
Kafka Eagle是什么? Kafka Eagle是一款用于监控和管理Apache Kafka的开源系统,它提供了完善的管理页面,例如Broker详情、性能指标趋势、Topic集合、消费者信息等。 源代码地址:https://github.com/smartloli/kafka-eagle 前置条件…...
本地部署SenseVoice(包括离线设备操作)
Anaconda3 Anaconda Installers and Packages SenseVoice 魔搭社区 FFmpeg FFmpeg 安装Anaconda3(Windows) 下载完成后,自定义路径后安装。在开始菜单中出现Anaconda Prompt说明安装成功。 安装Anaconda3(Linuxÿ…...
sql server 复制从备份初始化数据
参考 : 从备份初始化订阅(事务) - SQL Server | Microsoft Learn sql server 复制默认是用快照初始化数据的,也支持从备份初始化数据,参考如上...
MySQL 复合索引
MySQL 复合索引详解 引言 在实际业务场景中,多条件组合查询是最常见的操作之一。例如,根据“用户ID 时间范围”查询订单,或根据“商品分类 价格区间”筛选商品。此时,单列索引可能无法满足性能需求,而**复合索引&am…...
蓝桥杯备赛(C/C++组)
README: 本笔记是自己的备考笔记,按照官网提纲进行复习!适合有基础,复习用。 一、总考点 试题考查选手解决实际问题的能力,对于结果填空题,选手可以使用手算、软件、编程等方法解决,对于编程大…...
人类驾驶的人脑两种判断模式(反射和预判)-->自动驾驶两种AI模式
一种模式是直觉模式,判断是基于条件反射,视觉感知 触发到 直接条件反射(从经历中沉淀形成的神经信息闭环),类似现在自动驾驶技术的传统AI模式。 另一种模式是物理时空图式推理模式,判断是基于预判预测&…...
C语言机试编程题
编写版本:vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("请输入您要输入几个数");scanf_s("%d", &n);printf("请输入您要比较的%d个数\n",n);for (int i 0; i<n; i) {scanf_…...
SmartMediakit之音视频直播技术的极致体验与广泛应用
引言 在数字化时代,音视频直播技术已经深入到各个行业和领域,成为信息传递和交流的重要手段。视沃科技自2015年成立以来,一直致力于为传统行业提供极致体验的音视频直播技术解决方案,其旗下的大牛直播SDK凭借强大的功能和卓越的性…...
NVIDIA GEFORCE GTX1050显卡如何搭建AI人脸识别技术环境
NVIDIA GEFORCE GTX1050显卡如何搭建AI人脸识别技术环境!实际上,这个显卡虽然是入门级的,但是依然可以满足你的入门学习要求。 你的显卡是 NVIDIA GTX 1050,显存为 2GB,虽然它的性能不如高端显卡(如RTX 3060、3090等),但对于学习和研究 人脸识别技术,尤其是进行基础的…...
华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径
华为数通Datacom(Data Communication)课程是华为认证体系中的核心方向之一,聚焦企业网络通信与数据通信技术,适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别,逐级递…...
【运维】内网服务器借助通过某台可上外网的服务器实现公网访问
背景: 内网服务器无法连接公网,但是办公电脑可以连接内网服务器又可以连接公网。 安装软件 1、frp 2、ccproxy 配置 1、内网服务器 # 内网服务器启动frp服务配置文件参考vi frps.ini# frps.ini [common] bind_port 7000# 备注: bind_port端口可以随意配置。配置完…...
Spring之Bean的生命周期过程中调用的方法
1。这个部分除了6,9都在这了 package com.example.springbootdemo3.lifebeean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.con…...
Vue 中动态实现进度条
在 Vue 中动态实现进度条,基本上有两种常见的方法:直接通过 Vue 数据绑定控制样式,或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式,并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...
Qt互斥锁(QMutex)的使用、QMutexLocker的使用
Qt互斥锁【QMutex】的使用、QMutexLocker的使用 Chapter1 Qt互斥锁(QMutex)的使用、QMutexLocker的使用一、QMutexLocker和QMutex实现示例图二、QMutex和QMutexLocker的关系(个人理解)三、QMutex使用和QMutexLocker使用1.QMutex的使用2.QMutexLocker的使…...
Python开发 Flask框架面试题及参考答案
目录 Flask 的核心设计理念是什么?与 Django 相比有哪些显著差异? 解释 Flask 框架的核心理念及其作为 “微框架” 的优缺点 Flask 的依赖库有哪些?简述 Werkzeug 和 Jinja2 的作用 什么是 WSGI?Flask 如何基于 WSGI 实现服务端与应用的交互 解释 RESTful API 的设计原…...
DeepSeek模型昇腾部署优秀实践
2024年12月26日,DeepSeek-V3横空出世,以其卓越性能备受瞩目。该模型发布即支持昇腾,用户可在昇腾硬件和MindIE推理引擎上实现高效推理,但在实际操作中,部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…...
【cv】vs2022配置opencv
release下配置包含目录和库目录 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含链接器输入的依附依赖项 opencv_world490.lib release编译文件夹下需手动复制opencv_world49…...
RabbitMQ系列(五)基本概念之Queue
在 RabbitMQ 中,Queue(队列) 是存储消息的容器,也是消息传递的核心载体。以下是其核心特性与作用的全方位解析: 一、Queue 的定义与核心作用 消息存储容器 Queue 是 RabbitMQ 中实际存储消息的实体,生产者…...
从二维随机变量到多维随机变量
二维随机变量 设 X X X和 Y Y Y是定义在同一样本空间 Ω \varOmega Ω上的两个随机变量,称由它们组成的向量 ( X , Y ) (X, Y) (X,Y)为二维随机变量,亦称为二维随机向量,其中称 X X X和 Y Y Y是二维随机变量的分量。 采用多个随机变量去描述…...
IP-----动态路由OSPF
这只是IP的其中一块内容,IP还有更多内容可以查看IP专栏,前一章内容为GRE和MGRE ,可通过以下路径查看IP-------GRE和MGRE-CSDN博客,欢迎指正 注意!!!本部分内容较多所以分成了两部分在下一章 5.动态路由OS…...