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

CNN手写数字识别1——模型搭建与数据准备

模型搭建

我们这次使用LeNet模型,LeNet是一个经典的卷积神经网络(Convolutional Neural Network, CNN)架构,最初由Yann LeCun等人在1998年提出,用于手写数字识别任务

创建一个文件model.py。实现以下代码。

源码

# 导入PyTorch库
import torch
# 从PyTorch库中导入神经网络模块
from torch import nn
# 从torchsummary库中导入summary函数,用于打印模型的结构和参数数量
from torchsummary import summary# 定义LeNet类,它继承自nn.Module,是一个神经网络模型
class LeNet(nn.Module):# 初始化函数,定义模型的层次结构def __init__(self):# 调用父类的初始化函数super().__init__()# 第一个卷积层,输入通道为1,输出通道为6,卷积核大小为5x5,padding为2self.c1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2)# Sigmoid激活函数self.sig = nn.Sigmoid()# 第一个平均池化层,池化窗口为2x2,步长为2self.s2 = nn.AvgPool2d(kernel_size=2, stride=2)# 第二个卷积层,输入通道为6,输出通道为16,卷积核大小为5x5self.c3 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)# 第二个平均池化层,池化窗口为2x2,步长为2self.s4 = nn.AvgPool2d(kernel_size=2, stride=2)# Flatten层,用于将多维的输入一维化,以便输入到全连接层self.flatten = nn.Flatten()# 第一个全连接层,输入特征数为400,输出特征数为120self.f5 = nn.Linear(400, 120)# 第二个全连接层,输入特征数为120,输出特征数为84self.f6 = nn.Linear(120, 84)# 第三个全连接层,输入特征数为84,输出特征数为10(通常对应分类任务中的类别数)self.f7 = nn.Linear(84, 10)# 前向传播函数,定义数据通过网络的方式def forward(self, x):x = self.sig(self.c1(x))  # 通过第一个卷积层和Sigmoid激活函数x = self.s2(x)            # 通过第一个平均池化层x = self.sig(self.c3(x))  # 通过第二个卷积层和Sigmoid激活函数x = self.s4(x)            # 通过第二个平均池化层x = self.flatten(x)       # 通过Flatten层x = self.sig(self.f5(x))  # 通过第一个全连接层和Sigmoid激活函数x = self.sig(self.f6(x))  # 通过第二个全连接层和Sigmoid激活函数x = self.sig(self.f7(x))  # 通过第三个全连接层和Sigmoid激活函数return x# 主函数
if __name__ == "__main__":# 自动检测是否有可用的GPU,如果有则使用GPU,否则使用CPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 实例化LeNet模型,并将其移动到指定的设备上(GPU或CPU)model = LeNet().to(device)# 使用torchsummary的summary函数打印模型的结构和参数数量,输入形状为(1, 28, 28)print(summary(model, (1, 28, 28)))

源码解析

神经网络构建

LeNet网络主要由卷积层、池化层、激活函数和全连接层组成。有2个卷积层,2个池化层,3个全连接层。

  • 卷积层‌(nn.Conv2d):用于提取图像中的特征。这里有两个卷积层,第一个卷积层有6个输出通道,第二个卷积层有16个输出通道,卷积核大小都是5x5。
  • 激活函数‌(nn.Sigmoid):用于引入非线性,使得网络能够学习更复杂的模式。这里使用了Sigmoid激活函数。
  • 池化层‌(nn.AvgPool2d):用于降低特征图的尺寸,减少计算量,同时保留重要特征。这里使用了平均池化层,池化窗口大小为2*2,步长为2。
  • Flatten层‌(nn.Flatten):用于将多维的特征图展平成一维向量,以便输入到全连接层。
  • 全连接层‌(nn.Linear):用于分类任务,将特征向量映射到类别空间。这里有三个全连接层,分别将特征维度从400降到120,再从120降到84,最后从84降到10(对应10个类别)。

参数计算

从代码中可以看到每一层神经网络都有自己的参数,这里面通道数,卷积核大小,步长和感受野,一定程度上可以当做超参数人为自由设定,其他的参数都需要事先根据输入数据进行计算。

首先,假设输入的图像数据大小都是28*28*1,即宽28个像素,高28个像素,由于是灰度图所以色彩通道只有1。

在第一个卷积层c1,卷积核大小是5*5,卷积核个数是6个,步长默认是1,填充是2,这些是我们人为设定的。可可以得出输出通道数=卷积核个数=6,经过这一层的输出数据通道数为6,尺寸通过公式计算:

O=\frac{IN+2P-F}{S}+1 

公式里面O是输出的宽/高,IN是输入的宽/高,P是填充,F是卷积核的宽/高或者感受野的宽/高,S是步长。

即输出图像的宽高是(28+2*2-5)/1+1=28。输出数据量是28*28*6。可以看到卷积层可以有效提升数据的通道数。

在第一个池化层s2,感受野是2*2,步长是2,填充默认是0,可以计算出输出图像的宽高是(28+2*0-2)/2+1=14。可以看到经过池化层之后数据的特征量明显减少,此时输出的数据量是14*14*6(池化不会改变通道数)。

在第二个卷积层c3,卷积核大小是5*5,步长默认是1,填充默认是0,有16个卷积核,也就是通道数增加到了16。根据公式可以计算出输出图像的宽高是(14+2*0-5)/1+1=10。输出数据量是10*10*16。

在第二个池化层s4,感受野是2*2,步长为2,那么输出数据宽高就是(10+2*0-2)/2+1=5。输出数据量是5*5*16。

到全连接层的第一层就比较关键了,因为这里的参数有一个“输入特征数”,也就是刚才算的5*5*16=400。如果前面的计算不对,到了这一步模型是会报错的,因此每一层的输出特征量都需要计算出来。

后面的全连接层就比较好写了,输入的特征量是上一层全连接层的神经元个数。

前向传播

前向传播定义了数据通过网络的方式。对于输入x,它首先通过第一个卷积层和Sigmoid激活函数,然后通过第一个平均池化层;接着通过第二个卷积层和Sigmoid激活函数,再通过第二个平均池化层;最后通过Flatten层将多维特征展平成一维向量,并依次通过三个全连接层和Sigmoid激活函数得到最终输出。

验证

在主函数中,我们首先检测是否有可用的GPU,并将模型移动到合适的计算设备上(GPU或CPU)。然后,我们使用torchsummary的summary函数打印模型的结构和参数数量,以便了解模型的复杂度和计算需求。

从图中可以看出,池化层是不包含参数的,整个模型的大部分参数都在全连接层(48120+10164+850 = 59134,将近6万个参数在伺候全连接层)。

数据准备

FashionMNIST是一个流行的数据集,包含了10种类别的70,000个灰度图像,通常用于计算机视觉和机器学习的教学与研究。我们这次通过远程下载的方式来获取数据。

另外创建一个plot.python。用来下载数据和预览数据。这部分代码可写可不写,模型训练的时候还会重新加载数据。

源码

# 导入必要的库和模块
from torchvision import transforms  # 用于图像预处理的变换
from torchvision.datasets import FashionMNIST  # 导入FashionMNIST数据集
import torch.utils.data as Data  # 用于数据加载的实用工具
import numpy as np  # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt# 准备训练数据
train_data = FashionMNIST(root='./data',  # 数据集存储的根目录train=True,  # 指定为训练数据集transform=transforms.Compose([  # 图像预处理步骤transforms.Resize(size=224),  # 将图像大小调整为224x224transforms.ToTensor()  # 将图像转换为PyTorch张量]),download=True  # 如果数据集不存在,则下载
)# 创建数据加载器
train_loader = Data.DataLoader(dataset=train_data,  # 指定数据集batch_size=64,  # 每个批次的大小shuffle=True,  # 在每个epoch开始时打乱数据num_workers=0  # 使用0个工作线程(对于Windows系统,有时需要设置为0以避免多进程问题)
)# 遍历数据加载器
for step, (b_x, b_y) in enumerate(train_loader):if step > 0:  # 只处理第一个批次的数据break
# 将PyTorch张量转换为NumPy数组
batch_x = b_x.squeeze().numpy()  # 移除批次维度(如果可能),并转换为NumPy数组
batch_y = b_y.numpy()  # 将标签转换为NumPy数组# 获取数据集中的类别标签
class_label = train_data.classes  # 这是一个包含所有类别名称的列表
# 打印类别标签
print(class_label)  # 输出类别标签列表# 设置图形的大小
plt.figure(figsize=(12, 5))# 遍历batch_y中的每一个元素,即每一个样本的标签
for ii in np.arange(len(batch_y)):# 创建子图,4行16列,第ii+1个子图# 这里假设一个批次有64个样本,因此用4x16的布局来显示它们plt.subplot(4, 16, ii + 1)# 显示图像# batch_x[ii, :, :]表示第ii个样本的图像数据# cmap=plt.cm.gray指定使用灰度色彩映射plt.imshow(batch_x[ii, :, :], cmap=plt.cm.gray)# 设置标题为对应的类别标签# class_label[batch_y[ii]]根据标签索引获取类别名称# size=10设置标题字体大小plt.title(class_label[batch_y[ii]], size=10)# 关闭坐标轴显示plt.axis("off")# 调整子图之间的间距
# wspace=0.05设置子图之间的宽度间距
plt.subplots_adjust(wspace=0.05)# 显示图形
plt.show()

源码解析

下载和加载数据

首先准备训练数据。FashionMNIST数据集将被下载到指定的根目录,并进行图像预处理

为了高效地加载数据,我们使用PyTorch的DataLoader来创建数据加载器。

dataloader的参数解释如下:

  • dataset:指定要加载的数据集。
  • batch_size:每个批次加载的样本数。
  • shuffle:是否在每个epoch开始时打乱数据。
  • num_workers:加载数据时使用的工作线程数。在Windows系统上,有时需要设置为0以避免多进程问题。

展示数据

我们遍历数据加载器,但只处理第一个批次的数据(为了简化示例)。使用squeeze()方法移除批次维度(如果可能),并将PyTorch张量转换为NumPy数组,以便使用matplotlib进行可视化。随后使用matplotlib的subplot()方法创建子图,并在每个子图中显示一个图像样本。我们使用灰度色彩映射(cmap=plt.cm.gray)来显示图像。最后,使用plt.show()方法显示图形。

相关文章:

CNN手写数字识别1——模型搭建与数据准备

模型搭建 我们这次使用LeNet模型,LeNet是一个经典的卷积神经网络(Convolutional Neural Network, CNN)架构,最初由Yann LeCun等人在1998年提出,用于手写数字识别任务 创建一个文件model.py。实现以下代码。 源码 #…...

基于Istio Ambient Mesh的无边车架构:实现零侵入式服务网格的云原生革命

引言:轻量化时代的服务通信进化论 当传统Sidecar模式面临内存开销暴增的困境,Istio社区推出的Ambient Mesh架构给出终极解决方案。某证券交易系统实测显示,采用该架构后服务延迟降低至1.7ms(降幅达73%),同…...

数位dp入门详解

1. 介绍 数位 d p dp dp一般出现在来求一个范围 [ a , b ] [a, b] [a,b]内满足条件的数有多少。数位 d p dp dp的解决比较公式化,考虑每一位对最终答案的影响。 2. 案例 Luogu P2602: 求给定范围 [ a , b ] [a,b] [a,b]各个数位 k k k出现了多少次。 …...

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…...

牛顿法:用泰勒级数求解平方根的秘籍

目录 一、引言二、牛顿法的理论基础——泰勒级数三、牛顿法的原理与推导3.1 原理概述3.2 推导过程3.3 几何解释 四、牛顿法的应用场景4.1 数值计算4.2 优化问题 五、牛顿法求平方根的具体案例5.1 原理推导5.2 具体步骤5.3 代码实现(Python)5.4 示例计算过…...

四、敏捷方法论:敏捷开发中的关键实践

敏捷开发中的关键实践 在敏捷开发中,许多关键实践帮助团队提升效率、增强协作和确保高质量交付。通过合理运用这些实践,团队能够灵活应对需求变化、缩短交付周期,并持续优化工作流程。本文将详细介绍敏捷开发中的一些核心实践,包括用户故事、需求优先级排序、持续交付、持…...

基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录

目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…...

DeepSeek R1 与 OpenAI O1:机器学习模型的巅峰对决

我的个人主页 我的专栏:人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!!点赞👍收藏❤ 一、引言 在机器学习的广袤天地中,大型语言模型(LLM)无疑是最…...

【硬件设计细节】缓冲驱动器使用注意事项

一、缓冲驱动器核心功能与选型原则 信号增强与隔离 驱动能力匹配:根据负载电流需求选择缓冲器,例如CMOS缓冲器驱动能力通常为4-8mA,需搭配大电流负载时选用图腾柱输出或专用驱动芯片(如TI的SN74LVC系列)。电压域转换&…...

基于LVGL的简易聊天室

创建过程: 在GUI里配置好了一个大概的界面。聊天界面需要一个滑动页、一个输入框、一个文本框、一个发送按键。其中文本框属于滑动页,并且给发送按键添加上事件。 保存界面后,打开工程代码。 第一件事,是打开键盘使用的宏定义 随…...

DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

IDEA集成DeepSeek

引言 随着数据量的爆炸式增长,传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术,凭借其强大的语义理解与深度学习能力,正在改变搜索领域的游戏规则。 对于 Java 开发者而言,将 DeepSeek 集成…...

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…...

LeetCode热题100- 缺失的第一个正数【JavaScript讲解】

题目: 解题一: 如果不考虑时间复杂度和空间复杂度的话,我们最先想到的办法是先将该数组进行排序和去重,将最初的res结果值设置为1;将然后进行遍历,如果第一项不为1,则返回1,否则根…...

基于矢量轨道角动量波的透射超表面设计

摘 要:针对轨道角动量(Orbital Angular Momentum,OAM)在无线通信系统中相位奇点的问题,提出了一种产生矢量OAM波的透射超表面。设计了一种超表面透射单元实现透射极化和相位的调控,并由此单元排布组成透射超表面。采用透射超表面调控透射电磁波…...

全方位探索DeepSeek

目录 前言1. DeepSeek的基础功能与应用场景2. 使用DeepSeek的多种方式2.1 通过Web界面快速体验2.2 调用API实现自动化处理2.3 集成到本地开发环境2.4 结合第三方工具扩展功能 3. 高效使用DeepSeek的进阶技巧3.1 参数调优与性能优化3.2 数据处理与结果分析 4. 实际案例分析与应用…...

详解Redis数据结构(附源码)

引言 只有弄明白Redis数据结构,才能理解它如此快速的原因,并不只是它存储于内存,本篇文章将拆开Redis数据结构分析它高效的原因 字符串(String) 基本概念:字符串是 Redis 中最基本的数据结构,…...

基于Flask的茶叶销售数据可视化分析系统设计与实现

【FLask】基于Flask的茶叶销售数据可视化分析系统设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统的创新之处在于系统不仅提供了基础的图表展示,如价格分布、付款分…...

基于推荐算法的在线课程推荐系统设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

计时器任务实现(保存视频和图像)

下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…...

FreeRTOS第3篇:链表的“精密齿轮”——列表与列表项

文章目录 1 列表与列表项:FreeRTOS的“排队系统”2 列表操作:FreeRTOS的“排队算法”3 列表的应用场景:FreeRTOS的“任务调度枢纽”4 源码级洞察:列表的“灵魂代码”5 实战:列表操作实验6 总结与思考引言:嵌入式系统的“任务候车厅” 想象你正在管理一座繁忙的火车站:乘…...

Linux(ubuntu)下载ollama速度慢解决办法

国内安装Ollama都很慢,因为一直卡在下载中,直接通过官网的链接地址下载方法: curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%,完全不能接受啊! 其中很好的一个加速方式是通过使用github文件加速…...

【Java】分布式锁Redis和Redisson

https://blog.csdn.net/weixin_44606481/article/details/134373900 https://www.bilibili.com/video/BV1nW421R7qJ Redis锁机制一般是由 setnx 命令实现,set if not exists,语法setnx key value,将key设置值为value,如果key不存在…...

网络编程-

文章目录 网络编程套接字UDP/TCP的api使用 网络编程套接字 socket,是操作系统给应用程序(传输层给应用层)提供的api,Java也对这个api进行了封装。 socket提供了两组不同的api,UDP有一套,TCP有一套&#x…...

DeepSeek助力学术论文写作[特殊字符]

宝子们,还在为学术论文写作发愁吗?DeepSeek来帮你!只要用对提示词,它就能变成你写作路上的超级助手。今天就来给大家分享一些超好用的提示词,助力学术论文写作,让你的论文在ChatGPT的辅助下闪闪发光✨。 一…...

从零创建DeepSeek:技术路径与实践探索

import tensorflow as tf摘要:本文详细阐述了从零开始创建DeepSeek的全过程,涵盖从项目启动的构思,到技术选型的考量,再到模型训练的精细操作,以及系统集成、测试优化和部署上线的各个环节。通过对这些步骤的深入解析&…...

MySQL技术公开课:Mysql-Server-8.4.4 Innodb 集群搭建与维护

MySQL技术公开课 - Mysql-Server-8.4.4 Innodb 集群搭建与维护 讲课内容: 1、Innodb集群框架介绍 2、Innodb集群部署(mysql-Server、mysql-shell、mysql-router安装配置) 3、Innodb集群维护(主备切换、启动与关闭、故障排除) Mysql-server商业版目前最新的是8.…...

VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant

VS Code User和System版区别 Chapter1 VS Code User和System版区别1. 对于安装而言2. 结束语 Chapter2 VS Code 安装、配置教程及插件推荐插件: Chapter3 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤…...

动态规划两个数组dp问题系列一>最长重复子数组

目录 状态表示:状态转移方程:初始化:填表顺序:返回值:代码呈现: 状态表示: 状态转移方程: 初始化: 填表顺序: 返回值: 这里是以某一个位置为结尾定…...

在SpringBoot中使用UniHttp简化天地图路径规划调用实践

目录 写在最前面 前言 一、天地图路径规划简介 1、天地图相关服务 2、天地图路径规划接口 二、UniHttp简介 1、UniHttp是什么? 2、UniHttp能做什么? 三、UniHttp调用天地图接口 1、请求接口的定义 2、实际调用 3、相应结果展示 四、总结 写在…...

springboot与Freemarker

1 基本使用 1.1 介绍 FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类库。 FreeMarker 被设计用来生成 HTML Web 页面…...

CMake无法生成可执行文件,一直生成库文件

CMakeLists的内容如下,一直生成的main是库文件,而不是可执行文件。本人是在进行鸿蒙的交叉编译的时候遇到,归结为cmake属性的差异。原内容如下: # 设置最低CMake版本要求 cmake_minimum_required (VERSION 2.8.0)# 设置项目名称 …...

PrimeFaces实战:IdleMonitor与Ajax的完美结合

在现代的Web开发中,用户交互的实时反馈是一个重要的用户体验环节。PrimeFaces作为一个强大的Java EE UI库,提供了许多便捷的功能组件,其中之一就是IdleMonitor。通过IdleMonitor,我们可以轻松地检测用户何时处于空闲状态以及何时从…...

搭建一个经典的LeNet5神经网络

第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、LeNet-5背景 LeNet-…...

Transformer多头注意力并行计算原理与工业级实现:从数学推导到PyTorch工程优化

一、核心数学原理剖析 1.1 多头注意力矩阵分解 Q XW^Q ∈ R^{nd_k} K XW^K ∈ R^{nd_k} V XW^V ∈ R^{nd_v} 多头分解公式: head_i Attention(QW_i^Q, KW_i^K, VW_i^V) 其中 W_i^Q ∈ R^{d_kd_k/h}, W_i^K ∈ R^{d_kd_k/h}, W_i^V ∈ R^{d_vd_v/h} (h为头数…...

OpenAI 的变化对行业意味着什么?

哎呀,中国AI的发展可是搅动了一番风云。害怕自己正在失去对 AI 话语权的掌控,OpenAI 决定是时候全力出击了。 除了最近意外发布的 o3-mini 模型之外,Sam Altman 昨天还宣布了接下来几周/几个月的路线图,而这些变化相当显著&#…...

LinkedList

一.IDEA的链表库 IDEA上实现链表的包,实现的是无头双向不循环链表:(并且这个链表有头尾节点) 二.自己实现一个无头双向不循环链表 1.创建链表的类,在链表内中定义一个节点的内部类,并且在链表的类中定义头…...

半遮挡检测算法 Detecting Binocular Half-Occlusions

【1. 背景】: 本文分析【Detecting Binocular Half-Occlusions:Empirical Comparisons of Five Approaches】Geoffrey Egnal和Richard P. Wildes于2002年发表在IEEE Transactions on Pattern Analysis and Machine Intelligence上,这是1篇中…...

零基础购买阿里云服务器,XShell连接云服务器

目录 1.环境搭建方式 2. 使用云服务器 3.使用终端软件登录到Linux 4.使用XShell登录主机 5.连接失败的原因: 下一篇更新:Linux的基础指令以及如何Linux的环境搭建 1.环境搭建方式 主要有四种: 1.直接安装在物理机上,虽然Linux有图形化…...

Mac ARM 架构的命令行(终端)中,删除整行的快捷键是:Ctrl + U

在 Mac ARM 架构的命令行(终端)中,删除整行的快捷键是: Ctrl U这个快捷键会删除光标所在位置到行首之间的所有内容。如果你想删除光标后面的所有内容,可以使用: Ctrl K这两个快捷键可以帮助你快速清除当…...

ESP学习-1(MicroPython VSCode开发环境搭建)

下载ESP8266固件:https://micropython.org/download/ESP8266_GENERIC/win电脑:pip install esptools python.exe -m pip install --upgrade pip esptooo.py --port COM5 erase_flash //清除之前的固件 esptool --port COM5 --baud 115200 write_fla…...

微信小程序性能优化

微信小程序的性能优化是提升用户体验的关键。以下是一些常见的优化策略和技巧: 1. 减少 setData 的调用频率和数据量 setData 是小程序中更新视图的主要方式,但频繁调用或数据量过大会导致性能问题。 减少调用频率:避免在短时间内多次调用…...

五十天精通硬件设计第31天-阻抗

系列文章传送门 50天精通硬件设计第一天-总体规划-CSDN博客 目录 1. 核心概念:特性阻抗 2. 阻抗不匹配的后果 3. 关键影响因素 4. 阻抗匹配方法 5. 设计实践要点 6. 工具与测试 7. 常见问题解决 总结 信号完整性中的阻抗问题主要涉及传输线的特性阻抗匹配,是确保高…...

docker部署dify结合deepseek构建知识库

序 本文主要研究一下本地docker部署dify结合deepseek构建知识库 步骤 dify git clone https://github.com/langgenius/dify.git git co tags/0.15.3 -b 0.15.3 cd docker cp .env.example .env docker-comopse up启动之后访问localhost docker-comopse.yaml # # WARNING…...

11.C语言 malloc() calloc() realloc()分配内存

目录 malloc 好处 坏处 总结 calloc 参数说明 作用 与 malloc 的区别 示例 优点 缺点 总结 realloc 参数说明 作用 示例 优点 缺点 注意事项 总结 总结区别 对比表格 malloc 函数功能:分配内存给 void* malloc(size_t size); 来看一下deep…...

可信大模型:LLM + 神经符号推理,解决复杂推理任务

可信大模型:LLM 神经符号推理,解决复杂推理任务 论文大纲一、Why:研究要解决的现实问题二、What:核心发现或论点三、How:研究的整体方法与关键细节3.1 前人研究的局限性3.2 创新方法/视角3.3 关键数据或实验支持3.4 可…...

基于大数据的全国热门旅游景点数据分析系统的设计与实现

【大数据】基于大数据的全国热门旅游景点数据分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统主要包括登录注册、系统首页、图表分析、数据管理和个人信息五大功能模…...

Moya 网络框架

Moya 网络框架 定义enum类型,有多种接口就定义多少种,然后实现TargetType协议 import Foundation //导入网络框架 import Moyaenum DefaultService {//广告列表case ads(position : Int)case sheets(size:Int)case sheetDetail(data: String)case regi…...

【环境安装】重装Docker-26.0.2版本

【机器背景说明】Linux-Centos7;已有低版本的Docker 【目标环境说明】 卸载已有Docker,用docker-26.0.2.tgz安装包安装 1.Docker包下载 下载地址:Index of linux/static/stable/x86_64/ 2.卸载已有的Docker 卸载之前首先停掉服务 sudo…...

std::ranges::set_intersection set_union set_difference set_symmetric_difference

std::ranges::set_intersection:是 C20 引入的一个算法,用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 std::ranges::set_intersection 用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 注意事项…...