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

CNN手写数字识别/全套源码+注释可直接运行

数据集选择:

MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集(training set)由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局(the Census Bureau)的工作人员。测试集(test set)也是同样比例的手写数字数据,但保证了测试集和训练集的作者集不相交。MNIST数据集一共有7万张图片,其中6万张是训练集,1万张是测试集。每张图片是28 × 28 28\times 2828×28的0 − 9 0-90−9的手写数字图片组成。每个图片是黑底白字的形式,黑底用0表示,白字用0-1之间的浮点数表示,越接近1,颜色越白。

图片的标签以一维数组的one-hot编码形式给出:

[ 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 ]
每个元素表示图片对应的数字出现的概率,显然,该向量标签表示的是数字5。

MNIST数据集下载地址是http://yann.lecun.com/exdb/mnist/,它包含了4个部分:

训练数据集:train-images-idx3-ubyte.gz (9.45 MB,包含60,000个样本)。
训练数据集标签:train-labels-idx1-ubyte.gz(28.2 KB,包含60,000个标签)。
测试数据集:t10k-images-idx3-ubyte.gz(1.57 MB ,包含10,000个样本)。
测试数据集标签:t10k-labels-idx1-ubyte.gz(4.43 KB,包含10,000个样本的标签)。

废话不多说,首先看成果:
在这里插入图片描述
本项目请按照以下架构搭建:
在这里插入图片描述
下面是各个文件的python代码:
cnn_model.py:

模型架构和训练

# 导入必要的库
import torch
import torch.nn.functional as f  # 包含常用激活函数和操作
import torch.optim as optim  # 优化算法模块
from DataSet.mnist_set import mnist_set  # 自定义MNIST数据集加载器# 定义神经网络模型
class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()# 定义第一个卷积层:输入通道1(灰度图),输出通道10,卷积核5x5self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)# 定义第二个卷积层:输入通道10,输出通道20,卷积核5x5self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)# 定义最大池化层,窗口大小2x2,用于下采样self.pooling = torch.nn.MaxPool2d(2)# 全连接层:输入320个特征(由图像尺寸计算得到),输出10个类别(MNIST有0-9十个数字)self.fc = torch.nn.Linear(320, 10)def forward(self, x):batch_size = x.size(0)  # 获取当前批次大小# 第一层卷积 -> 池化 -> ReLU激活x = f.relu(self.pooling(self.conv1(x)))# 第二层卷积 -> 池化 -> ReLU激活x = f.relu(self.pooling(self.conv2(x)))# 将四维张量展平为二维:[batch_size, channels*width*height]x = x.view(batch_size, -1)  # -1表示自动计算该维度大小# 通过全连接层得到最终输出(未使用softmax,因为CrossEntropyLoss会自动处理)x = self.fc(x)return x# 创建模型实例
model = Net()
# 检测GPU可用性,并设置设备(GPU优先)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("是否使用GPU", torch.cuda.is_available())
model.to(device)  # 将模型转移到选定的设备(GPU/CPU)# 定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()  # 交叉熵损失(适用于分类任务)
optimizer = optim.SGD(  # 随机梯度下降优化器model.parameters(),  # 需要优化的模型参数lr=0.01,  # 学习率momentum=0.5  # 动量参数,加速收敛
)def train(epoch, train_loader):""" 模型训练函数:param epoch: 当前训练轮次:param train_loader: 训练数据加载器"""running_loss = 0.0  # 累计损失值# 遍历训练数据(enumerate自动生成批次索引)for batch_idx, data in enumerate(train_loader, 0):inputs, target = data  # 解包数据(输入图像,目标标签)inputs, target = inputs.to(device), target.to(device)  # 数据转移至设备optimizer.zero_grad()  # 清空梯度(防止梯度累积)outputs = model(inputs)  # 前向传播loss = criterion(outputs, target)  # 计算损失loss.backward()  # 反向传播计算梯度optimizer.step()  # 更新模型参数running_loss += loss.item()  # 累加损失值# 每300个batch打印一次训练状态(300是任意选择的打印频率)if batch_idx % 300 == 299:print('[%d, %.5d] loss: %.3f' %(epoch + 1, batch_idx + 1, running_loss / 2000))running_loss = 0.0  # 重置累计损失def test(test_loader):""" 模型测试函数:param test_loader: 测试数据加载器"""correct = 0  # 正确预测数total = 0  # 总样本数with torch.no_grad():  # 禁用梯度计算(节省内存,加速计算)for data in test_loader:inputs, target = datainputs, target = inputs.to(device), target.to(device)outputs = model(inputs)# 获取预测结果(返回最大值和对应索引,这里取索引即类别)_, predicted = torch.max(outputs.data, dim=1)total += target.size(0)  # 累加批次样本总数correct += (predicted == target).sum().item()  # 统计正确预测数# 打印测试准确率(正确数/总数)print('Accuracy on test set: %d %% [%d/%d]' %(100 * correct / total, correct, total))if __name__ == '__main__':# 加载数据集train_loader, test_loader = mnist_set()# 训练循环for epoch in range(10):train(epoch, train_loader)test(test_loader)  # 每个epoch后测试# 训练完成后保存模型参数model_path = 'mnist_model.pth'torch.save(model.state_dict(), model_path)print(f'\n模型参数已保存至:{model_path}')# 初始化新模型实例loaded_model = Net().to(device)# 加载保存的权重loaded_model.load_state_dict(torch.load(model_path))print('\n模型参数加载验证完成')

model_use.py:

从数据集挑十张图片进行预测,使用保存的模型

import matplotlib.pyplot as plt
import torch
import torch.nn.functional as f  # 包含常用激活函数和操作
import randomdef visualize_predictions(model, dataset, num_images=10):"""可视化模型预测结果Args:model: 加载好的模型dataset: 数据集对象(测试集)num_images: 需要可视化的图片数量"""# 设置为评估模式(影响Dropout和BatchNorm等层的计算)model.eval()device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 随机选择图片索引indices = random.sample(range(len(dataset)), num_images)# 创建画布fig, axes = plt.subplots(2, 5, figsize=(30, 12))plt.subplots_adjust(hspace=3, wspace=2)  # 调整子图间距for idx, ax in enumerate(axes.flat):# 获取数据image, true_label = dataset[idx]original_image = image.numpy().squeeze()  # 转换为numpy数组并去除通道维度# 预处理:添加批次维度并转移到设备image = image.unsqueeze(0).to(device)  # 形状从 [1,28,28] -> [1,1,28,28]# 预测with torch.no_grad():output = model(image)probabilities = f.softmax(output, dim=1)predicted_prob, predicted_label = torch.max(probabilities, 1)# 可视化设置ax.imshow(original_image, cmap='gray')ax.set_xticks([])ax.set_yticks([])# 标题显示预测结果(红色表示错误预测,蓝色表示正确)color = 'blue' if predicted_label == true_label else 'red'ax.set_title(f'Pred: {predicted_label.item()}' +f'True: {true_label}' +f'Prob: {predicted_prob.item():.1%}',color=color)plt.show()

mnist_set.py:

提供数据集的下载和导入,没有自动下载哦

from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader# 准备数据集
def mnist_set():""":param::return: train_loader, test_loader"""batch_size = 64transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)train_loader = DataLoader(train_dataset,shuffle=True,batch_size=batch_size)test_dataset = datasets.MNIST(root='../dataset/mnist',train=False,download=True,transform=transform)test_loader = DataLoader(test_dataset,shuffle=False,batch_size=batch_size)return train_loader, test_loader

main.py:
在训练并保存模型后,调用保存的模型来进行手写预测

注意cv2库实际上要下载opencv-python

Python安装cv2(OpenCV)的终极指南:告别pip install cv2的坑!-CSDN博客

import cv2
import numpy as np
import torch
import timefrom CnnModel import Netclass DrawingApp:def __init__(self):# 窗口参数self.win_name = "MNIST Drawing Pad"self.win_size = (800, 400)self.pad_pos = (50, 80)  # 书写区域位置self.pad_size = (280, 280)self.preview_pos = (400, 80)# 初始化黑底画布(0=黑色,255=白色)self.img = np.zeros((self.pad_size[1], self.pad_size[0]), np.uint8)self.processed_img = np.zeros((28, 28), np.uint8)# 创建窗口cv2.namedWindow(self.win_name, cv2.WINDOW_NORMAL)cv2.resizeWindow(self.win_name, *self.win_size)cv2.setMouseCallback(self.win_name, self.mouse_handler)# 加载模型self.model = Net()self.model.load_state_dict(torch.load('CnnModel/mnist_model.pth'))self.model.eval()# 预测参数self.last_predict = {"pred": -1, "conf": 0.0}self.last_predict_time = 0def mouse_handler(self, event, x, y, flags, param):pad_x = x - self.pad_pos[0]pad_y = y - self.pad_pos[1]if (0 <= pad_x < self.pad_size[0]) and (0 <= pad_y < self.pad_size[1]):if event == cv2.EVENT_LBUTTONDOWN:self.drawing = Trueself.last_point = (pad_x, pad_y)elif event == cv2.EVENT_MOUSEMOVE and self.drawing:# 用白色(255)绘制线条cv2.line(self.img, self.last_point, (pad_x, pad_y), 255, 15)self.last_point = (pad_x, pad_y)elif event == cv2.EVENT_LBUTTONUP:self.drawing = Falsecv2.line(self.img, self.last_point, (pad_x, pad_y), 255, 15)else:self.drawing = Falsedef preprocess(self):"""预处理(保持黑底白字)"""resized = cv2.resize(self.img, (28, 28))# 直接归一化,保持黑底白字tensor_img = torch.from_numpy(resized).float() / 255.0# 存储处理后的图像用于显示self.processed_img = resizedreturn tensor_img.unsqueeze(0).unsqueeze(0)def update_ui(self):# 创建黑底背景canvas = np.zeros((self.win_size[1], self.win_size[0], 3), dtype=np.uint8)# 绘制书写区域边框(浅灰色)cv2.rectangle(canvas, self.pad_pos,(self.pad_pos[0] + self.pad_size[0], self.pad_pos[1] + self.pad_size[1]),(200, 200, 200), 2)# 嵌入书写内容(直接显示白字)canvas[self.pad_pos[1]:self.pad_pos[1] + self.pad_size[1],self.pad_pos[0]:self.pad_pos[0] + self.pad_size[0]] = cv2.cvtColor(self.img, cv2.COLOR_GRAY2BGR)# 显示预处理画面preview_size = 140preview_img = cv2.resize(self.processed_img, (preview_size, preview_size),interpolation=cv2.INTER_NEAREST)# 转换为彩色显示preview_display = cv2.cvtColor(preview_img, cv2.COLOR_GRAY2BGR)# 绘制预处理框(浅灰色)cv2.rectangle(canvas, self.preview_pos,(self.preview_pos[0] + preview_size, self.preview_pos[1] + preview_size),(200, 200, 200), 2)canvas[self.preview_pos[1]:self.preview_pos[1] + preview_size,self.preview_pos[0]:self.preview_pos[0] + preview_size] = preview_display# 添加文字说明(白色)cv2.putText(canvas, "Model Input (28x28)",(self.preview_pos[0], self.preview_pos[1] - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)# 显示预测结果(绿色文字)result_text = f"Prediction: {self.last_predict['pred']}" if self.last_predict['pred'] != -1 else "Draw a digit"conf_text = f"Confidence: {self.last_predict['conf']:.1f}%"cv2.putText(canvas, result_text, (20, 40),cv2.FONT_HERSHEY_DUPLEX, 0.9, (0, 255, 0), 2)cv2.putText(canvas, conf_text, (20, 80),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 200, 200), 2)# 帮助文字(白色)help_text = "[SPACE] Clear  [ESC] Exit"cv2.putText(canvas, help_text, (self.win_size[0] - 250, self.win_size[1] - 20),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)return canvasdef run(self):while True:# 自动预测if time.time() - self.last_predict_time > 0.5 and np.any(self.img != 0):processed_tensor = self.preprocess()with torch.no_grad():output = self.model(processed_tensor)prob, pred = torch.max(torch.nn.functional.softmax(output, 1), 1)self.last_predict = {"pred": pred.item(), "conf": prob.item() * 100}self.last_predict_time = time.time()# 更新界面display = self.update_ui()cv2.imshow(self.win_name, display)# 处理窗口变化new_size = cv2.getWindowImageRect(self.win_name)[2:]if new_size != self.win_size:self.win_size = new_sizeself.pad_size = (min(300, self.win_size[0] // 2 - 100), min(300, self.win_size[1] - 100))self.img = cv2.resize(self.img, self.pad_size)# 按键处理key = cv2.waitKey(1)if key == 27:breakelif key == 32:  # 空格键清除self.img = np.zeros((self.pad_size[1], self.pad_size[0]), np.uint8)self.processed_img = np.zeros((28, 28), np.uint8)self.last_predict = {"pred": -1, "conf": 0.0}if __name__ == "__main__":app = DrawingApp()app.run()cv2.destroyAllWindows()

最后如果报错的话注意路径即可,正常情况是能直接运行的,因为使用的相对路径
end

相关文章:

CNN手写数字识别/全套源码+注释可直接运行

数据集选择&#xff1a; MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集&#xff08;training set&#xff09;由来自250个不同人手写的数字构成&#xff0c;其中50%是高中学生&#xff0c;50%来自人口普查局&…...

基于springboot+vue网页系统的社区义工服务互动平台(源码+论文+讲解+部署+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 在社会文明程度不断提升、社区治理需求持续深化的大背景下&#xff0c;社区义工服务作为…...

MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping|文献速递-深度学习医疗AI最新文献

Title 题目 MBSS-T1: Model-based subject-specific self-supervised motion correction forrobust cardiac T1 mapping MBSS-T1&#xff1a;基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping 01 文献速递介绍 心脏T1定量成像&#xff08;Quantitative Car…...

Google机器学习实践指南(迭代学习机制解析篇)

&#x1f525; Google机器学习(5)-迭代学习机制解析 Google机器学习实战(5)-深入理解模型训练中的迭代优化过程 一、迭代学习概念 ▲ 核心定义&#xff1a; 在训练机器学习模型时&#xff0c;首先对权重和偏差进行初始猜测&#xff0c;然后反复调整这些猜测&#xff0c;直到…...

【时时三省】Python 语言----文件

目录 1,文件打开 2, 文件关闭 3, 文件写入 4, 文件读出 5, 文件定位 6, 文件重命名 7, 复制文件 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,文件打开 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…...

WPF···

设置启动页 默认最后一个窗口关闭,程序退出,可以设置 修改窗体的icon图标 修改项目exe图标 双击项目名会看到代码 其他 在A窗体点击按钮打开B窗体,在B窗体设置WindowStartupLocation=“CenterOwner” 在A窗体的代码设置 B.Owner = this; B.Show(); B窗体生成在A窗体中间…...

架构图 C4 规范简介

架构图 C4 规范简介 C4&#xff08;Context, Containers, Components, Code&#xff09;是一种用于软件架构可视化的分层建模方法&#xff0c;由 Simon Brown 提出。它通过四个不同层次的抽象来描述软件系统&#xff0c;适用于不同受众&#xff08;如业务人员、架构师、开发人…...

运维Web服务器核心知识与实战指南

一、Web服务器基础概述 &#xff08;一&#xff09;核心定义与功能 Web服务器是互联网的基础设施&#xff0c;负责存储、处理和传输网页内容&#xff0c;通过HTTP/HTTPS协议与客户端交互。其核心功能包括&#xff1a; 请求处理&#xff1a;监听端口&#xff08;默认80/443&a…...

免费建站系统是什么?如何选择免费建站系统?

如今&#xff0c;换互联网成为大家生活中必不可少的一部分。对于普通的个人、一些企业、包括一些事业单位&#xff0c;拥有一个高效实用的网站成为展示、宣传、产品介绍的重要途径。但是对于很多用户来说&#xff0c;对于一些没有建站基础的用户来说&#xff1a;建站是一项高门…...

React---day1

React 它允许我们只需要维护自己的状态&#xff0c;当状态改变时&#xff0c;React可以根据最新的状态去渲染我们的UI界面 开发React必须依赖三个库&#xff1a; eact&#xff1a;包含react所必须的核心代码react-dom&#xff1a;react渲染在不同平台所需要的核心代码babel&…...

赋能智慧党建:远眺科技助力党校可视化系统高效落地

项目背景&#xff1a;智慧党校建设的时代召唤 在数字化浪潮席卷各行各业的今天&#xff0c;传统党校亦面临转型升级的迫切需求。 宁波某地党校&#xff0c;积极响应国家关于推进“智慧党建”的号召&#xff0c;旨在通过引入先进信息技术&#xff0c;打造一个集数据展示、信息…...

解决使用HBuilder X开发时uView组件不生效的问题

1.uni-ui 是一个为 uni-app 开发的 UI 组件库&#xff0c;你可以通过 npm 安装它。 在项目的根目录下打开终端&#xff08;可以通过菜单“工具” > “终端”打开&#xff09;&#xff0c;然后运行以下命令来安装 uni-ui&#xff1a; npm install uview-ui2.安装后&#xff…...

React中 lazy与 Suspense懒加载的组件

MyHead.jsx console.log(MyHead.jsx); function Head() {return <>hello Head</>; } export default Head;懒加载.jsx // 引入 React 的 useState、lazy 和 Suspense API // lazy 用于懒加载组件&#xff0c;Suspense 用于在加载过程中显示 loading 状态 import …...

网络学习-利用reactor实现http请求(六)

一、实现HTTP请求 1、印象里面&#xff0c;总有人说C/C语言不能实现HTTP请求&#xff0c;其实不然。C/C语言完全可以实现HTTP请求。通过对select,poll,epoll等IO多路复用技术的学习以及reactor模式的学习&#xff0c;完全能够实现HTTP请求。 2、webserver 主要解决两个问题 …...

【东枫科技】usrp rfnoc 开发环境搭建

作者 太原市东枫电子科技有限公司 &#xff0c;代理销售 USRP&#xff0c;Nvidia&#xff0c;等产品与技术支持&#xff0c;培训服务。 环境 Ubuntu 20.04 依赖包 sudo apt-get updatesudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils …...

RabbitMQ的其中工作模式介绍以及Java的实现

文章目录 前文一、模式介绍1. 简单模式2. 工作队列模式3. 广播模式4. 路由模式5. 通配符模式6. RPC模式7. 发布确认模式 二、代码实现1、简单模式2、工作队列模式生产者消费者消费者 1消费者 2 3、广播模式 (Fanout Mode)生产者消费者 4、路由模式 (Direct Mode)生产者消费者 5…...

Docker 镜像打包到本地

保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下&#xff1a; docker save [options] IMAGE [IMAGE...]示例&#xff1a;docker save -o centos.tar centos:latest--output 或 -o&#xff1a;将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…...

5分钟搭建智能看板:衡石科技自助式BI工具使用教程

在数据驱动的时代&#xff0c;业务人员需要快速将数据转化为洞察&#xff0c;而非依赖IT团队排队开发报表。衡石科技HENGSHI SENSE的自助式BI工具&#xff0c;通过零代码配置、模板化设计、智能分析三大核心能力&#xff0c;让任何人都能在5分钟内搭建专业级数据看板。本文将手…...

安卓开发用到的设计模式(1)创建型模式

安卓开发用到的设计模式&#xff08;1&#xff09;创建型模式 文章目录 安卓开发用到的设计模式&#xff08;1&#xff09;创建型模式1. 单例模式&#xff08;Singleton Pattern&#xff09;2. 工厂模式&#xff08;Factory Pattern&#xff09;3. 抽象工厂模式&#xff08;Abs…...

Unity3D序列化机制详解

前言 Unity3D的序列化机制是其编辑器与运行时数据管理的核心&#xff0c;理解其工作原理对高效开发至关重要。以下是关键点总结&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 1. 序列化的作…...

[Harmony]自定义导航栏

1.方案一 CustomNavigationBar import { router } from kit.ArkUI; import { DevicesUtil } from ../utils/DevicesUtil; import { common } from kit.AbilityKit;Component export struct CustomNavigationBar {State private navHeight: number 44State parTitle: string …...

LeetCode117_填充每个结点的下一个右侧结点指针Ⅱ

LeetCode117_填充每个结点的下一个右侧结点指针Ⅱ 标签&#xff1a;#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签&#xff1a;#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树 Ⅰ. 题目 给定一个二叉树&#xff1a; struct Node {int v…...

Qt enabled + geometry 属性(2)

文章目录 enabled属性可用与禁用的概念API接口代码演示 阐述说明1. 先简单描述下要如何演示出上面两个接口的效果&#xff08;思路&#xff09;2. 事先规范按钮对象的命名3. 定义两个按钮对象的槽函数 动图演示效果4. widget.cpp geometry属性预备知识API接口上下左右移动 ta…...

OpenHarmony外设驱动使用 (十),Sensor

OpenHarmony外设驱动使用 &#xff08;十&#xff09; Sensor 概述 功能简介 Sensor驱动模型屏蔽硬件器件差异&#xff0c;为上层Sensor服务系统提供稳定的Sensor基础能力接口&#xff0c;包括Sensor列表查询、Sensor启停、Sensor订阅及取消订阅&#xff0c;Sensor参数配置等…...

(2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板

在上stm32课程&#xff0c;有这样一道要求&#xff1a; 参考了大佬的文章之后&#xff0c;发现出现了liteos_m.mk文件找不到的情况&#xff0c;于是只能另寻他路 VSCode 搭建 STM32 开发环境_vscode stm32仿真-CSDN博客 【OpenHarmony】移植 3.1 版本系统到 STM32_openharm…...

【HTML-4】HTML段落标签:构建内容结构的基础

在网页开发中&#xff0c;段落标签<p>是最基础也是最重要的HTML元素之一。这篇博客将深入探讨段落标签的用法、最佳实践以及相关技术细节。 1. 段落标签的基本用法 HTML段落标签用于定义文本段落&#xff0c;浏览器会自动在段落前后添加一定的空白&#xff08;margin&a…...

深度学习+Flask 打包一个AI模型接口并部署上线

🚀 深度学习 + Flask 打包一个 AI 模型接口并部署上线(实战教程) 深度学习模型训练完毕后,我们该如何部署上线让它“动起来”?本篇带你手把手用 Flask 将训练好的 PyTorch 模型封装成 Web 接口,实现一个轻量、可访问的在线 AI 服务。 🧠 一、为什么要部署模型? 训练…...

C++类与对象(二):六个默认构造函数(二)

在上篇提到了构造函数、拷贝构造函数、析构函数&#xff0c;这篇将会分享剩下默认构造函数&#xff1a;赋值运算符重载、运算符重载。当学习了这些构造函数可以实现一个日期类。 目录 运算符重载 赋值运算符重载 前置 后置 运算符重载 函数名字为&#xff1a;关键字operat…...

HarmonyOS NEXT应用开发实战:玩鸿蒙App客户端开发

之前学习android时候&#xff0c;有一个玩android的客户端项目很火&#xff0c;不但能够学习知识&#xff0c;还能够动手实践&#xff0c;激发学习兴趣。这里作者通过一个完整的实战项目—玩鸿蒙客户端App&#xff0c;一块儿深入学习如何在HarmonyOS平台上开发一个功能丰富且完…...

十六、面向对象底层逻辑-BeanPostProcessor接口设计

一、引言&#xff1a;Bean生命周期的精密控制 在Spring容器的Bean实例化过程中&#xff0c;BeanPostProcessor接口是开发者介入对象初始化阶段的核心扩展点。作为Spring框架最强大的扩展机制之一&#xff0c;该接口提供了对Bean实例化过程的原子级控制能力&#xff0c;支撑了A…...

在线免费图片处理工具-传道软件图片工具

在线免费图片处理工具-传道软件图片工具 在线免费图片处理工具&#xff0c;无需注册与登录&#xff0c;用完即走。 官网链接&#xff1a; https://www.chdaoai.com/image.html 功能有&#xff1a; Favicon图标生成&#xff0c;图片颜色拾取器&#xff0c;屏幕颜色拾取&…...

JS进阶学习04

一、深浅拷贝 1.浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝&#xff1a;拷贝的是地址 常见方法&#xff1a; 1. 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {...obj} 拷贝对象 2. 拷贝数组&#xff1a;Array.prototype.concat() 或者 [...arr] >如果是简…...

CSS、SCSS 和 SASS 的语法差异

CSS、SCSS 和 SASS 的语法差异 CSS (Cascading Style Sheets) 标准样式表语言&#xff0c;所有浏览器原生支持语法特点&#xff1a; 使用大括号 {} 包裹规则使用分号 ; 结束声明简单的选择器-属性-值结构 .container {width: 100%;margin: 0 auto; }SCSS (Sassy CSS) CSS的…...

ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的使用场景

在Spring Boot项目中&#xff0c;ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的使用场景不同&#xff0c;但大部分开发者会更倾向于用 ThreadPoolTaskExecutor。我来给你拆解清楚&#xff0c;面试时直接甩这个答案&#xff01; 1️⃣ 核心区别 ThreadPoolExecutor&#xf…...

打卡31天

文件的规范拆分和写法 知识点回顾 规范的文件命名 规范的文件夹管理 机器学习项目的拆分 编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目&#xff0c;准备拆分的项目文件&#xff0c;思考下哪些部分可以未来复用。 补充介绍&#xff1a; pyc文件的介绍 知识…...

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市分析 OBOO鸥柏品牌推出的AI数字人触摸屏查询触控人脸识别语音交互一体机&#xff0c;是其在智能交互设备领域的又一创新产品。该一体机整合了触摸屏查询、AI人脸识别、AI声源定位语音麦克风&#xff0c;触控交互以…...

基于大模型的闭合性尺桡骨干骨折全方位诊疗研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、大模型技术原理与应用现状 2.1 大模型基本原理 2.2 在医疗领域的应用案例 三、闭合性尺桡骨干骨折概述 3.1 骨折定义与分类 3.2 流行病学特征 3.3 临床症状与诊断方法 四、大模型在术前风险预测中的应用 4.1 数…...

Win11上安装docker

Win11上安装docker 一、安装WSL&#xff08;Windows Subsystem for Linux&#xff09;二、安装docker到D盘三、启动docker四、测试启动容器 一、安装WSL&#xff08;Windows Subsystem for Linux&#xff09; 以管理员身份打开cmd 更新WSL wsl --update3. 安装WSL wsl --ins…...

Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理 主要内容:条件组合、中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景…...

如何在 Android 手机和平板电脑上下载应用程序

对于Android用户来说&#xff0c;从Google Play Store下载应用程序并不陌生&#xff0c;对吧&#xff1f;但是&#xff0c;除了 Google Play 商店之外&#xff0c;您还可以在哪里为 Android 设备下载和安装应用程序呢&#xff1f;这就是我们今天要分享的内容。我们解释了 6 种下…...

C++23 新特性:允许 std::stack 与 std::queue 从迭代器对构造 (P1425R4)

文章目录 背景与动机提案内容与实现细节提案 P1425R4实现细节编译器支持 对开发者的影响提高灵活性简化代码向后兼容性 总结 C23标准带来了许多令人兴奋的新特性和改进&#xff0c;其中之一便是对标准容器的增强。提案P1425R4允许 std::stack 和 std::queue 直接从一对迭代器…...

在线OJ系统测试报告

在线OJ系统测试报告 项目背景项目功能管理员功能用户功能 测试计划功能测试自动化测试性能测试 项目背景 本项目为在线OJ系统&#xff0c;采用微服务架构以及前后端分离的方法来实现&#xff0c;包含用户管理、题目管理、竞赛管理、判题服务、网关服务、消息与任务调度等多个子…...

31-35【动手学深度学习】深度学习硬件

1. CPU和GPU 1.1 CPU CPU每秒钟计算的浮点运算数为0.15&#xff0c;GPU为12。GPU的显存很低&#xff0c;16GB&#xff08;可能32G封顶&#xff09;&#xff0c;CPU可以一直插内存。 左边是GPU&#xff08;只能做些很简单的游戏&#xff0c;视频处理&#xff09;&#xff0c;中…...

Dify的大语言模型(LLM) AI 应用开发平台-本地部署

前言 今天闲着&#xff0c;捣鼓一下 Dify 这个开源平台&#xff0c;在 mac 系统上&#xff0c;本地部署并运行 Dify 平台&#xff0c;下面记录个人在本地部署Dify 的过程。 Dify是什么&#xff1f; Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#…...

《MQTT 从 0 到 1:原理、实战与面试指南全解》

一、MQTT 是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种 轻量级、基于发布/订阅&#xff08;Pub/Sub&#xff09;模式的消息传输协议&#xff0c;适用于物联网&#xff08;IoT&#xff09;、实时通信等对 低带宽、高延迟、不稳定…...

SpringMVC 通过ajax 实现文件的上传

使用form表单在springmvc 项目中上传文件&#xff0c;文件上传成功之后往往会跳转到其他的页面。但是有的时候&#xff0c;文件上传成功的同时&#xff0c;并不需要进行页面的跳转&#xff0c;可以通过ajax来实现文件的上传 下面我们来看看如何来实现&#xff1a; 方式1&…...

图片识别(TransFormerCNNMLP)

目录 一、Transformer &#xff08;一&#xff09;ViT&#xff1a;Transformer 引入计算机视觉的里程碑 &#xff08;二&#xff09;Swin-Transformer&#xff1a;借鉴卷积改进 ViT &#xff08;三&#xff09;VAN&#xff1a;使用卷积模仿 ViT &#xff08;四&#xff09;…...

手术机器人行业新趋势:Kinova多机械臂协同系统如何突破复杂场景适应性瓶颈?

机器人手术历经多阶段技术演进&#xff0c;已成为现代医疗重要方向。其需求增长源于医疗机构对高精度低风险手术方案的需求、微创手术普及及技术进步带来的复杂场景适应性提升。Kinova 轻型机械臂凭借模块化设计与即插即用功能&#xff0c;可快速适配不同手术环境&#xff0c;为…...

国酒华夏实业酒水供应链:全品类覆盖打造一站式购销平台

在消费升级与供应链效率双重驱动的酒水行业变革中&#xff0c;国酒华夏实业凭借全品类覆盖与数字化赋能&#xff0c;构建起集采购、品鉴、文化传播于一体的新型酒水供应链体系。其“一站式购销平台”模式不仅重塑了传统酒水流通链路&#xff0c;更通过精准服务与品质保障&#…...

【Qt】:设置hover属性,没有适应到子控件中

#ButtonStyle:hover 是一个 ID 选择器&#xff0c;仅对设置了 objectName"ButtonStyle" 的控件本身生效&#xff0c;不会自动应用到其子控件&#xff08;如 QLabel 和 QWidget&#xff09;。 在ButtonForm中&#xff0c;有一个Qwidget控件&#xff0c;在这个Qwidget中…...