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

二、模型训练与优化(4):模型优化-实操

下面我将以 MNIST 手写数字识别模型为例,从 剪枝 (Pruning)量化 (Quantization) 两个常用方法出发,提供一套可实际动手操作的模型优化流程。此示例基于 TensorFlow/Keras 环境,示范如何先训练一个基础模型,然后对其进行剪枝和量化,最后验证优化后的模型性能。


目录

  1. 整体流程概览
  2. 模型剪枝 (Pruning)
    1. 安装依赖库
    2. 修改训练脚本实现剪枝
    3. 如何运行剪枝脚本
    4. 检查与验证剪枝后模型
  3. 模型量化 (Quantization)
    1. 原理与应用场景
    2. 在脚本中添加量化步骤
    3. 运行量化脚本
    4. 验证量化后模型
  4. 常见问题与建议
  5. 总结

1. 整体流程概览

在之前博客中已经可以训练一个基础 MNIST 模型(train_mnist.py)并成功获得 mnist_model.h5 的前提下,通常会按照以下顺序进行优化:

在模型训练好后,可以在mnist_project文件夹下找到mnist_model.h5,如下:

  1. 剪枝 (Pruning):减小模型大小、去除不重要的权重,生成 pruned_mnist_model.h5
  2. (可选)量化 (Quantization):将浮点模型转化为 INT8 等低比特模型,大幅减小模型体积,并提升推理速度,生成 mnist_model_quant.tflite

在此过程中,我们需要:

  • 修改已有脚本新增脚本来执行剪枝和量化的操作。
  • 确保虚拟环境已安装必要库tensorflow-model-optimizationtensorflow-lite等)。
  • 反复验证模型的大小、推理速度、准确率,找到最适合部署需求的平衡点。

2. 模型剪枝 (Pruning)

2.1 安装依赖库

  • TensorFlow Model Optimization Toolkit:其中包含 tfmot.sparsity.keras 模块,可用于剪枝、量化感知训练等。

在激活的虚拟环境(tf_env 等)下,输入:

pip install tensorflow-model-optimization

如果已经安装过,可以跳过此步骤;若版本较旧,建议 pip install --upgrade tensorflow-model-optimization

2.2 修改训练脚本实现剪枝

这里给出的示例代码可放在一个新的脚本(如 prune_mnist.py),或者在原 train_mnist.py 中替换。示例如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import tensorflow_model_optimization as tfmotdef main():# 1. 加载 MNIST 数据集(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()# 2. 数据预处理x_train = x_train.astype("float32") / 255.0x_test  = x_test.astype("float32") / 255.0x_train = x_train.reshape(-1, 28 * 28)x_test  = x_test.reshape(-1, 28 * 28)# 3. 定义剪枝参数pruning_params = {# PolynomialDecay 让剪枝率从 initial_sparsity 到 final_sparsity 逐渐增加'pruning_schedule': tfmot.sparsity.keras.PolynomialDecay(initial_sparsity=0.0,     # 初始剪枝率 (0%)final_sparsity=0.5,       # 最终剪枝率 (50%)begin_step=0,             # 剪枝开始 stepend_step=np.ceil(len(x_train) / 64).astype(np.int32) * 5# end_step: 这里相当于 epochs * (训练集样本数 / batch_size))}# 4. 构建剪枝后的模型#   - 先定义一个包含1~2层的网络#   - 使用 prune_low_magnitude 对最后一层进行剪枝封装model = tf.keras.models.Sequential([tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),tfmot.sparsity.keras.prune_low_magnitude(tf.keras.layers.Dense(10, activation='softmax'),**pruning_params)])# 5. 编译模型model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 6. 设置剪枝回调#    - UpdatePruningStep:在每个批次/epoch后更新剪枝进度#    - PruningSummaries:可选,将剪枝信息写入到指定 log_dir,配合 TensorBoard 查看callbacks = [tfmot.sparsity.keras.UpdatePruningStep(),tfmot.sparsity.keras.PruningSummaries(log_dir='logs')]# 7. 训练模型#    - epochs=5 可以根据需要加大或减少history = model.fit(x_train, y_train,epochs=5,batch_size=64,validation_split=0.1,callbacks=callbacks)# 8. 模型评估test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)print(f"\n测试集上的准确率: {test_acc:.4f}")# 9. 保存剪枝后的模型#    - 先使用 strip_pruning 去除剪枝包装器,得到最终“瘦身”模型final_model = tfmot.sparsity.keras.strip_pruning(model)final_model.save("pruned_mnist_model.h5")# 10. 可视化训练过程plot_history(history)def plot_history(history):"""可视化训练曲线"""acc = history.history['accuracy']val_acc = history.history['val_accuracy']loss = history.history['loss']val_loss = history.history['val_loss']epochs_range = range(len(acc))plt.figure(figsize=(12, 4))# 绘制准确率曲线plt.subplot(1, 2, 1)plt.plot(epochs_range, acc, label='训练准确率')plt.plot(epochs_range, val_acc, label='验证准确率')plt.legend(loc='lower right')plt.title('训练和验证准确率')# 绘制损失曲线plt.subplot(1, 2, 2)plt.plot(epochs_range, loss, label='训练损失')plt.plot(epochs_range, val_loss, label='验证损失')plt.legend(loc='upper right')plt.title('训练和验证损失')plt.show()if __name__ == "__main__":main()
代码要点
  1. tfmot.sparsity.keras.PolynomialDecay:定义从 0% 到 50% 的剪枝率逐渐增加的策略。
  2. prune_low_magnitude(...):对目标层进行剪枝包装。可以只对某些关键层做剪枝,也可对网络所有层做封装。
  3. strip_pruning(...):剪枝训练完后,需要去掉剪枝相关的“假”节点,才能得到真正稀疏的权重以减小体积。

2.3 如何运行剪枝脚本

  1. 确保已经训练过一个基础模型(可选,如果想微调原模型);或者像示例这样直接在脚本里构建一个新的网络。
  2. 打开 Anaconda Prompt(或终端),激活虚拟环境
    conda activate tf_env
    
  3. 导航到脚本所在目录
    cd C:\Users\FCZ\Desktop\Projects\mnist_project
    
  4. 运行脚本
    python prune_mnist.py
    

训练过程结束后,会打印出测试集准确率,并在目录下生成 pruned_mnist_model.h5

2.4 检查与验证剪枝后模型

  1. 模型体积:相较原始不剪枝模型,pruned_mnist_model.h5 通常会更小,但因 HDF5 格式本身包含稀疏权重的表示方式,实际文件大小并不总是线性减少。关键是剪枝会让权重矩阵变得稀疏,后续可以配合特定框架(如 STM32Cube.AI)进行再处理。
  2. 准确率:可能略有降低,一般会在 0.97~0.98 附近。若下降过多,可调整 final_sparsity (如从 0.5 改为 0.3) 或增加微调 epochs。
  3. 后续可做量化:将剪枝后模型再进行量化,可实现进一步体积和推理速度的提升。

3. 模型量化 (Quantization)

3.1 原理与应用场景

  • 量化:把模型中的权重(和激活)从 float32 转化成 int8、float16 等低位格式,典型方式是使用 TensorFlow Lite 的离线量化。
  • 适用场景:需要在嵌入式或移动端部署,同时希望降低模型大小和加速推理。
  • 代价:可能带来少量精度损失。如果需要减小精度损失,可用量化感知训练(QAT)。

3.2 在脚本中添加量化步骤

当我们在 train_mnist.py 训练完基础模型后,在prune_mnist.py完成剪枝操作后,接下来完成量化操作,编写单独脚本 quantize_mnist.py:将 训练、剪枝、量化 三个步骤整合在一起

"""
quantize_mnist.py
-----------------
在同一个脚本中完成:
1. MNIST 基础模型训练
2. 剪枝 (Pruning)
3. 量化 (Quantization)依赖:- tensorflow>=2.5- tensorflow-model-optimization- numpy, matplotlib (可选, 用于可视化)
"""import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import tensorflow_model_optimization as tfmotdef load_mnist_data():"""加载 MNIST 数据,并做基本预处理。"""(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()x_train = x_train.astype("float32") / 255.0x_test  = x_test.astype("float32") / 255.0# 展开 28x28 -> 784x_train = x_train.reshape(-1, 28 * 28)x_test  = x_test.reshape(-1, 28 * 28)return (x_train, y_train), (x_test, y_test)def create_base_model():"""构建一个简单的全连接 MNIST 模型。"""model = tf.keras.models.Sequential([tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),tf.keras.layers.Dense(10, activation='softmax')])return modeldef plot_history(history, title_prefix=""):"""可视化训练曲线"""acc = history.history['accuracy']val_acc = history.history['val_accuracy']loss = history.history['loss']val_loss = history.history['val_loss']epochs_range = range(len(acc))plt.figure(figsize=(12, 4))# 准确率曲线plt.subplot(1, 2, 1)plt.plot(epochs_range, acc, label='训练准确率')plt.plot(epochs_range, val_acc, label='验证准确率')plt.legend(loc='lower right')plt.title(f'{title_prefix} 训练和验证准确率')# 损失曲线plt.subplot(1, 2, 2)plt.plot(epochs_range, loss, label='训练损失')plt.plot(epochs_range, val_loss, label='验证损失')plt.legend(loc='upper right')plt.title(f'{title_prefix} 训练和验证损失')plt.show()def main():# =======================================# 1. 数据准备# =======================================(x_train, y_train), (x_test, y_test) = load_mnist_data()# =======================================# 2. 训练基线模型# =======================================print("\n--- 步骤1: 训练基线模型 ---")base_model = create_base_model()base_model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])history_base = base_model.fit(x_train, y_train,epochs=5,batch_size=64,validation_split=0.1)test_loss_base, test_acc_base = base_model.evaluate(x_test, y_test, verbose=0)print(f"基线模型测试集准确率: {test_acc_base:.4f}")# 可视化基线模型训练过程plot_history(history_base, title_prefix="基线模型")# 保存基线模型base_model.save("mnist_model.h5")# =======================================# 3. 剪枝 (Pruning)# =======================================print("\n--- 步骤2: 剪枝模型 ---")# 定义剪枝参数:从0%渐增到50%的剪枝率pruning_params = {'pruning_schedule': tfmot.sparsity.keras.PolynomialDecay(initial_sparsity=0.0,final_sparsity=0.5,begin_step=0,end_step=np.ceil(len(x_train) / 64).astype(np.int32) * 5)}# 用之前的 base_model 权重来构造可剪枝模型# 也可直接对 base_model 做 prune_low_magnitude,但这里分开写更清晰pruned_model = tf.keras.models.Sequential([tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),tfmot.sparsity.keras.prune_low_magnitude(tf.keras.layers.Dense(10, activation='softmax'),**pruning_params)])# 把 base_model 的第一层权重复制到 pruned_model 第1层pruned_model.layers[0].set_weights(base_model.layers[0].get_weights())# 编译可剪枝模型pruned_model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 设置回调:更新剪枝步数 + 记录日志callbacks = [tfmot.sparsity.keras.UpdatePruningStep(),tfmot.sparsity.keras.PruningSummaries(log_dir='logs')]history_pruned = pruned_model.fit(x_train, y_train,epochs=3,          # 可以适当增加训练轮数batch_size=64,validation_split=0.1,callbacks=callbacks)test_loss_pruned, test_acc_pruned = pruned_model.evaluate(x_test, y_test, verbose=0)print(f"剪枝后模型测试集准确率: {test_acc_pruned:.4f}")plot_history(history_pruned, title_prefix="剪枝模型")# strip_pruning: 得到真正稀疏的权重final_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)final_pruned_model.save("pruned_mnist_model.h5")# =======================================# 4. 量化 (Quantization)# =======================================print("\n--- 步骤3: 量化剪枝后模型 (PTQ) ---")# 您也可以对 base_model 做量化,这里演示对 剪枝后的模型 做量化converter = tf.lite.TFLiteConverter.from_keras_model(final_pruned_model)converter.optimizations = [tf.lite.Optimize.DEFAULT]# 如需要 representative_dataset 来校准,可添加:# converter.representative_dataset = ...# 转换为 TFLitetflite_quant_model = converter.convert()# 保存量化后的 TFLite 文件with open('pruned_mnist_model_quant.tflite', 'wb') as f:f.write(tflite_quant_model)print("量化后的剪枝模型已保存: pruned_mnist_model_quant.tflite")# 如有需要,可使用 tflite interpreter 测试推理# 这里仅演示到生成 TFLite 文件即可if __name__ == "__main__":main()
注意
  • 量化完成后,记得在 PC 或嵌入式设备上进行推理测试,查看最终精度。

3.3 运行量化脚本

  1. 依旧在 Anaconda Prompt 中激活环境conda activate tf_env
  2. 导航到脚本所在目录
  3. 执行: python quantize_mnist.py
  4. 观察输出:若无异常,脚本会提示 "量化后的模型已保存为 mnist_model_quant.tflite"
  • 训练基线模型:训练 5 轮得到 mnist_model.h5
  • 剪枝模型:基于基线模型的权重进行剪枝,训练 3 轮得到 pruned_mnist_model.h5
  • 量化模型:将剪枝后的模型转换为 .tflite 格式,并保存为 pruned_mnist_model_quant.tflite
  • 结果文件

  •          mnist_model.h5:基线模型(未剪枝、未量化)。

       pruned_mnist_model.h5:剪枝后且 strip_pruning 的 Keras 模型。

       pruned_mnist_model_quant.tflite:剪枝后再量化的 TFLite 模型,通常体积最小,速度也更快(具体依赖硬件支持)。

总结

接下来对优化后的模型进行验证,验证方法:

  • 在脚本运行过程中会输出基线模型剪枝模型的测试集准确率。
  • .tflite 文件可以用 TFLite InterpreterSTM32Cube.AI 进行推理测试,查看最终精度和性能。

相关文章:

二、模型训练与优化(4):模型优化-实操

下面我将以 MNIST 手写数字识别模型为例,从 剪枝 (Pruning) 和 量化 (Quantization) 两个常用方法出发,提供一套可实际动手操作的模型优化流程。此示例基于 TensorFlow/Keras 环境,示范如何先训练一个基础模型,然后对其进行剪枝和…...

开发人员学习书籍推荐(C#、Python方向)

作为一名开发人员,持续学习和提升自己的技术水平是至关重要的。如今,技术不断更新换代,新的开发框架、语言和工具层出不穷。对于刚入行的开发者或希望深入某一领域的工程师来说,选对书籍是学习的捷径之一。本篇文章将推荐一些经典…...

【HTML+CSS+JS+VUE】web前端教程-31-css3新特性

圆角 div{width: 100px;height: 100px;background-color: saddlebrown;border-radius: 5px;}阴影 div{width: 200px;height: 100px;background-color: saddlebrown;margin: 0 auto;box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);}...

【Elasticsearch】批量操作:优化性能

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...

sklearn-逻辑回归-制作评分卡

目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线,判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中,评分卡是…...

Saas数据库迁移单租户数据

1、背景 租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…...

23_Spring Boot中Redis缓存实现

1.基于注解的Redis缓存实现 下面我们在之前Spring Boot默认缓存管理的基础上引入Redis缓存组件,使用基于注解的方式讲解Spring Boot整合Redis缓存的具体实现。 1.使用@Cacheable、@CachePut、@CacheEvict注解定制缓存管理。对CommentServiceImpl类中的方法进行修改,使用@Ca…...

Vue 学习之旅:核心技术学习总结与实战案例分享(vue指令下+计算属性+侦听器)

Vue 学习之旅:核心技术学习总结与实战案例分享 文章目录 Vue 学习之旅:核心技术学习总结与实战案例分享一、指令补充(一)指令修饰符(二)v-bind 对样式操作的增强(三)v-model 应用于其…...

【Linux网络编程】数据链路层 | MAC帧 | ARP协议

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系…...

vscode vue 自动格式化

vscode vue 自动格式化 安装Prettier和Vetur插件 选择设置,并且转到编辑文件。增加如下内容。 {"editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","[vue]": {"editor.defaultFor…...

GitCode G-Star 光引计划终审前十名获奖项目公示

在技术的浩瀚星空中,GitCode 平台上的 G-Star 项目熠熠生辉。如今,“光引计划” 已圆满落幕,众多 G-Star 项目作者,一同分享项目在 GitCode 平台托管的宝贵体验,并深入挖掘平台的多样玩法。 众多投稿纷至沓来&#xf…...

Postgres14.4(Docker安装)

Postgres14.4(Docker安装) 一,Docker拉取镜像 docker pull postgres:14.4 #检查镜像是否拉取成功 docker images | grep postgres二,新建挂载目录,并运行容器 mkdir -p /data/postgre/data chmod 777 /data/postgre/…...

R.swift库的详细用法

R.swift 是一个 Swift 工具库,它提供了一个自动生成的类 R,使得你可以通过类型安全的方式访问项目中的资源,例如图片、字体、颜色、XIB 文件等。通过 R.swift,你可以避免字符串类型的错误,提升代码的可维护性。 以下是 R.swift 库的详细用法: 1. 安装 R.swift 使用 Sw…...

Redis高危漏洞-GHSA-whxg-wx83-85p5:用户可能会使用特制的 Lua 脚本来触发堆栈缓冲区溢出

官方漏洞描述:https://github.com/redis/redis/security/advisories/GHSA-whxg-wx83-85p5 Redis 是一个高性能的键值数据库,广泛用于缓存和存储数据。由于其功能丰富,Redis 允许用户通过 Lua 脚本来执行服务器端的操作。Lua 脚本通常用来在 …...

分组通道自注意力G-CSA详解及代码复现

G-CSA定义 G-CSA (Grouped Channel Self-Attention) 是一种创新性的视觉注意力机制,巧妙地结合了卷积和自注意力的优势。通过将输入特征图划分为多个独立的通道组,在每个组内执行自注意力操作,G-CSA实现了高效的全局信息交互,同时保留了局部特征细节。这种方法不仅提高了模…...

Unity 自定义批量打包工具

打包配置项 using UnityEngine; using System.Collections.Generic;namespace MYTOOL.Build {[System.Flags]public enum VersionOptions{None 0,Major 1,Minor 4,Build 8,Revision 0x10,}/// <summary>/// 批量打包配置文件/// </summary>[CreateAssetMenu]…...

WebGL性能检测

WebGL性能检测系统说明 检测维度 1. WebGL版本支持检测(20分) WebGL 1.0 和 WebGL 2.0 版本检测WebGL 2.0 支持得20分仅支持WebGL 1.0 得12分主要影响高级特性和性能优化的可用性2. GPU性能评估(25分) 通过WEBGL_debug_renderer_info获取显卡信息根据GPU品牌和型号进行评…...

C#,图论与图算法,输出无向图“欧拉路径”的弗勒里(Fleury Algorithm)算法和源程序

1 欧拉路径 欧拉路径是图中每一条边只访问一次的路径。欧拉回路是在同一顶点上开始和结束的欧拉路径。 这里展示一种输出欧拉路径或回路的算法。 以下是Fleury用于打印欧拉轨迹或循环的算法&#xff08;源&#xff09;。 1、确保图形有0个或2个奇数顶点。2、如果有0个奇数顶…...

Jenkins触发器--在其他项目执行后构建

前言&#xff1a; jenkins中有多种触发器可用&#xff0c;可以方便的控制构建的启动 这里简单介绍下项目后构建的配置方法 1. 解释&#xff1a; Build after other projects are built Set up a trigger so that when some other projects finish building, a new build is…...

UE5.4运行报错解决(关于osg使用-无法解决的外部命令)(未解决)

报错如下&#xff1a; 09:38:06:665 4>EpicGames.Core -> E:\AppInstall\EpicGames\UE_5.4\Engine\Source\Programs\Shared\EpicGames.Core\bin\Development\net6.0\EpicGames.Core.dll 09:38:06:668 5>------ 已启动全部重新生成: 项目: EpicGames.MsBuild, 配…...

Swift语言的软件工程

Swift语言的软件工程 引言 随着科技的不断进步&#xff0c;软件开发行业正在经历着前所未有的变化。在这场变革中&#xff0c;Swift语言作为苹果公司推出的一种新型编程语言&#xff0c;凭借其简洁、高效及安全的特性&#xff0c;正在快速崛起&#xff0c;成为现代软件工程中…...

国内外网络安全政策动态(2024年12月)

▶︎ 1.2项网络安全国家标准获批发布 2024年12月6日&#xff0c;根据2024年11月28日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2024年第29号&#xff09;&#xff0c;全国网络安全标准化技术委员会归口的2项网络安全国家标准正…...

DELTA并联机械手视觉方案荣获2024年度机器人应用典型案例奖

直击现场 2025年1月9日晚&#xff0c;2024深圳市机器人年度评选颁奖典礼在深圳市南山区圣淘沙酒店正式拉开帷幕。本次颁奖活动由中国科学院深圳先进技术研究院指导&#xff0c;深圳市机器人协会与《机器人与智能系统》杂志组织承办。 正运动公司受邀参与此次典礼&#xff0c;…...

python 3个线程轮流打印A、B、C

要实现 Python 中三个线程轮流打印 A、B、C 的效果&#xff0c;可以使用 threading 模块和 Condition 或 Lock 来同步线程。以下是使用 Condition 的解决方案&#xff1a; 代码实现 import threading# 初始化条件变量 condition threading.Condition() current 0 # 共享变…...

Http 响应状态码 前后端联调

http 响应状态码 &#xff1a;是服务器在处理HTTP请求时返回的状态信息&#xff0c;用于表示请求的处理结果 1xx : 信息性状态码 100 Continue: 服务器已收到请求头部&#xff0c;客户端应继续发送请求体。 101 Switching Protocols : 切换协议。服务器已理解客户端的请求&a…...

AI Agent:软件测试自动化的新纪元

在信息技术日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术的蓬勃发展正引领着各个行业的深刻变革&#xff0c;软件测试领域同样迎来了前所未有的机遇与挑战。AI Agent&#xff0c;这一融合了先进机器学习与自然语言处理技术的智能实体&#xff0c;正悄然成…...

C#结构体,枚举,泛型,事件,委托--10

目录 一.结构体 二.特殊的结构体(ref struct): 三.枚举 四.泛型 泛型的使用: 1.泛型类:定义一个泛型类,使用类型参数T 2.泛型方法:在方法定义中使用类型参数 3.泛型接口 五.委托及泛型委托 委托 泛型委托 六.事件 事件: 泛型事件:使用泛型委托&#xff08;如Event…...

MATLAB语言的语法糖

MATLAB语言的语法糖 在现代编程语言中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;是一个常见的概念&#xff0c;它指的是某种编程语言提供的语法&#xff0c;使得代码更加简洁易读&#xff0c;而不改变语言本身的功能。MATLAB作为一种广泛应用于科学计算、工程…...

前端开发:HTML常见标签

1.注释标签 注释不会显示在界面上 . 目的是提高代码的可读性 . ctrl / 快捷键可以快速进行注释 / 取消注释 . <!-- 我是注释 --> 2.标题标签 有六个 , 从 h1 - h6. 数字越大 , 则字体越小 <h1> hello </h1> //我们所写的csdn的格式中的标题一…...

《AI发展的三个关键视角:基础设施、开源趋势与社会影响》

基础设施在AI研究中至关重要&#xff0c;但往往被忽视 基础设施在AI研究中至关重要&#xff0c;但往往被忽视&#xff0c;这一观点可以从多个方面进行深入探讨&#xff1a; 1. 基础设施的定义 基础设施在AI研究中通常指的是支持研究和开发的硬件、软件、网络和数据管理系统。…...

eslint.config.js和.eslintrc.js有什么区别

eslint.config.js 和 .eslintrc.js 的主要区别在于它们所对应的 ESLint 版本和配置方法&#xff1a; 1. .eslintrc.js&#xff1a; 这是 ESLint v8 及更早版本使用的配置文件格式。 它使用层级式的配置系统。 现在被称为"旧版"配置格式 。 2. eslint.config.js&am…...

Open FPV VTX开源之默认MAVLink设置

Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题 1. 源由 飞控图传…...

一学就废|Python基础碎片,OS模块

Python 中的操作系统模块提供了与操作系统交互的功能。操作系统属于 Python 的标准实用程序模块。该模块提供了一种使用依赖于操作系统的功能的可移植方式。os和os. path模块包括许多与文件系统交互的函数。 Python-OS 模块函数 我们将讨论 Python os 模块的一些重要功能&…...

新版本的IDEA如何解决Git分支显示为警告⚠<unknown>的问题

目录 问题再现 解决思路 首先我们要想到 这个分支有没有从远程代码仓库拉去下来 复习一下 git 命令 其次思考 最后思考 问题再现 这边我使用的是 IDEA 2024.3.3.1 Jetbrains 官网的最新版 同时也是官方账号登录 的 今天上 github 去拉项目到 本地 出现了分支不显示的问…...

HTML和CSS相关的问题,为什么页面加载速度慢?

页面加载速度慢是网站优化中一个常见的问题&#xff0c;可能由于多种原因&#xff0c;包括HTML和CSS的代码编写方式、资源的加载顺序、页面渲染的复杂性等。以下是一些常见的原因和优化方法&#xff0c;结合实际项目代码示例进行讲解。 1. 过多的资源请求 如果页面包含大量的…...

使用葡萄城+vue实现Excel

最终实现效果如下 包含增加复选框 设置公式 设置背景颜色等&#xff0c;代码实在太多 有需要可留言 第一步&#xff1a;创建表头 请使用官网提供的网址&#xff1a;在线 Excel 编辑器 | SpreadJS 在线表格编辑器 1.点击下方号&#xff0c;创建一个新的sheet页 默认新创建的she…...

【漫话机器学习系列】042.提前停止训练的优势(Early Stopping Advantages)

提前停止训练&#xff08;Early Stopping&#xff09;的优势 提前停止是一种有效的正则化技术&#xff0c;在训练模型时通过监控验证集的性能来决定训练的结束点&#xff0c;从而避免过拟合。以下是提前停止的主要优势&#xff1a; 1. 防止过拟合 提前停止通过在验证集性能开…...

【2024遥感应用组一等奖】基于风云四号卫星的小时级大气气溶胶和颗粒物监测

作品介绍‍ 01 研究背景‍ 人口和产业的增长和集聚,增加了污染物的排放,改变了污染物的扩散条件,导致中国区域空气污染严重,是目前可持续发展面临的重大挑战之一。其中细颗粒物(PM2.5)是国内主要的空气污染物,威胁居民的身心健康,影响城市生态系统中社会、经济和自然…...

Cesium加载地形

Cesium的地形来源大致可以分为两种&#xff0c;一种是由Cesium官方提供的数据源&#xff0c;一种是第三方的数据源&#xff0c;官方源依赖于Cesium Assets&#xff0c;如果设置了AccessToken后&#xff0c;就可以直接使用Cesium的地形静态构造方法来获取数据源CesiumTerrainPro…...

Spring-Cloud-Gateway-Samples,nacos为注册中心,负载均衡

背景&#xff1a;本想找个简单例子看下&#xff0c;无奈版本依赖太过复杂&#xff0c;花了点时间。记录下吧 使用Spring Cloud Gateway作为网关服务&#xff0c;Nacos作为注册中心&#xff0c;实现对子服务的负载均衡访问。简单例子。 环境要求&#xff1a;JDK1.8、nacos 1.3…...

Centos9 + Docker 安装 MySQL8.4.0 + 定时备份数据库到本地

Centos9 Docker 安装 MySQL8.4.0 定时备份数据库到本地 创建目录&#xff0c;创建配置文件启动容器命令定时备份MySQL执行脚本Linux每日定时任务命令文件内参数其他时间参数 AT一次性定时任务 创建目录&#xff0c;创建配置文件 $ mkdir -p /opt/mysql/conf$ vim /opt/mysql/…...

【开源免费】基于Vue和SpringBoot的英语知识应用网站(附论文)

本文项目编号 T 138 &#xff0c;文末自助获取源码 \color{red}{T138&#xff0c;文末自助获取源码} T138&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

aws(学习笔记第二十四课) 使用sam开发step functions

aws(学习笔记第二十四课) 使用sam开发step functions 学习内容&#xff1a; 生成sam的step functions实例程序什么是SAM amazon Serverless Application ModelSAM程序结构SAM执行程序 1. 生成sam的step functions实例程序 参照文档 这里参照AWS的官方文档SAM amazon Serverl…...

RabbitMQ介绍与使用

RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;使用 Erlang 编程语言构建。它是消息队列&#xff08;MQ&#xff09;的一种&#xff0c;广泛应用于分布式系统中&#x…...

LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))

LeetCode 热题 100_腐烂的橘子&#xff08;52_994&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;广度优先遍历&#xff08;队列&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一…...

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …...

《AI模型格局演变:Claude、Gemini Flash与OpenAI的技术角力》

Anthropic的Claude模型在通用聊天模型中表现优异&#xff0c;但在市场份额上仍落后于OpenAI Anthropic的Claude模型在通用聊天模型中的表现优异&#xff0c;主要体现在以下几个方面&#xff1a; 1. 技术优势 性能表现: Claude模型在处理复杂任务&#xff08;如编程、自然语言…...

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…...

01、kafka知识点综合

kafka是一个优秀大吞吐消息队列&#xff0c;下面我就从实用的角度来讲讲kafka中&#xff0c;“kafka为何有大吞吐的机制”&#xff0c;“数据不丢失问题”&#xff0c;“精准一次消费问题” 01、kafka的架构组织和运行原理 kafka集群各个节点的名称叫broker&#xff0c;因为kaf…...

K8S集群常用命令

1&#xff0c;查看pod kubectl get pods -A 查看所有的pod kubectl get pods 这个只查看namespace为default下的pod&#xff0c;也就是只查看默认命名空间下的pod kubectl get pod -A -o wide 查看所有的pod&#xff0c;并且放出的信息更全&#xff08;包含了pod的ip&#xff0…...