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

《深度学习实战》第10集:联邦学习与隐私保护

第10集:联邦学习与隐私保护

2025年3月4日更新了代码,补充了实例程序运行截图 和 如何提高模型准确率的方法
系统梳理 集集精彩 代码验证 保证实战
随着数据隐私问题日益受到关注,联邦学习(Federated Learning) 作为一种分布式机器学习方法,正在成为解决隐私保护与模型训练矛盾的关键技术。本文将带你深入了解联邦学习的基本原理、核心技术,并通过实战项目展示其应用。


在这里插入图片描述

一、知识点:联邦学习的核心概念

1. 联邦学习的基本原理

联邦学习是一种分布式机器学习框架,其核心思想是**“数据不动,模型动”**。具体来说,联邦学习允许多个客户端(如手机、IoT设备等)在本地训练模型,然后将模型更新发送到中央服务器进行聚合,而无需共享原始数据。

联邦学习的主要特点
  • 隐私保护:数据始终保存在本地,避免了敏感信息的泄露。
  • 分布式计算:充分利用边缘设备的计算能力,减少对中心服务器的依赖。
  • 异构性支持:能够处理不同设备上的非独立同分布(Non-IID)数据。
联邦学习的典型架构

在这里插入图片描述

2. 差分隐私与同态加密

为了进一步增强隐私保护,联邦学习通常结合以下两种技术:

  • 差分隐私(Differential Privacy)
    差分隐私通过在模型更新中添加噪声,确保单个数据点对最终结果的影响被限制在一定范围内,从而防止攻击者通过模型反推出原始数据。

  • 同态加密(Homomorphic Encryption)
    同态加密允许在加密数据上直接进行计算,而无需解密。这种方法可以确保模型更新在传输过程中始终保持加密状态,进一步提升安全性。


二、实战项目:使用 TensorFlow Federated 实现简单的联邦学习实验

1. 环境准备 python3.8.8 注意一定要python 3.8系列

安装虚拟环境后把pip升级到最新版本,否则会失败

首先,安装 TensorFlow Federated(TFF)库:

pip install tensorflow-federated
2. 数据准备(以下代码可以在jupyter notebook分段运行,也可以整合在一个代码文件运行)

我们使用 TensorFlow 提供的模拟数据集 tff.simulation.datasets.emnist,这是一个手写数字识别任务的数据集。

import tensorflow as tf
import tensorflow_federated as tff
import collections# 加载 EMNIST 数据集
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()# 查看数据集结构
print(f"训练集客户端数量: {len(emnist_train.client_ids)}")
print(f"测试集客户端数量: {len(emnist_test.client_ids)}")
3. 模型定义

定义一个简单的卷积神经网络(CNN)作为全局模型:

def create_keras_model():return tf.keras.models.Sequential([tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')])# 将 Keras 模型转换为 TFF 模型
def model_fn():# 获取第一个客户端的数据集dataset = emnist_train.create_tf_dataset_for_client(emnist_train.client_ids[0])# 预处理数据集,添加通道维度def preprocess(dataset):def batch_format_fn(element):return collections.OrderedDict([('x', tf.expand_dims(element['pixels'], axis=-1)),('y', element['label'])])return dataset.map(batch_format_fn).batch(20)  # 假设批量大小为20preprocessed_dataset = preprocess(dataset)# 检查数据集的 element_specelement_spec = preprocessed_dataset.element_specreturn tff.learning.from_keras_model(create_keras_model(),input_spec=element_spec,  # 使用包含 'x' 和 'y' 的 input_specloss=tf.keras.losses.SparseCategoricalCrossentropy(),metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
4. 联邦学习过程

使用 TFF 的联邦平均算法(FedAvg)进行分布式训练:

# 定义预处理函数
def preprocess(dataset):def batch_format_fn(element):return collections.OrderedDict([('x', tf.expand_dims(element['pixels'], axis=-1)),('y', element['label'])])return dataset.map(batch_format_fn).batch(20)  # 假设批量大小为20# 定义联邦平均过程
iterative_process = tff.learning.build_federated_averaging_process(model_fn,client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.02),server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0)
)# 初始化全局模型
state = iterative_process.initialize()# 进行多轮联邦训练
NUM_ROUNDS = 10
for round_num in range(1, NUM_ROUNDS + 1):# 随机选择部分客户端参与训练sampled_clients = emnist_train.client_ids[:5]# 对每个客户端的数据进行预处理federated_train_data = [preprocess(emnist_train.create_tf_dataset_for_client(client)) for client in sampled_clients]# 执行一轮训练result = iterative_process.next(state, federated_train_data)state = result[0]  # 获取第一个元素作为 state# 输出训练结果metrics = result[1]  # 获取第二个元素作为 metrics# 打印指标结构(仅在第一轮执行,帮助调试)if round_num == 1:print("指标结构:", metrics.keys())# 从 'train' 键下获取指标train_metrics = metrics['train']print(f"Round {round_num}, Loss: {train_metrics['loss']:.4f}, Accuracy: {train_metrics['sparse_categorical_accuracy']:.4f}")
5. 测试模型性能

在测试集上评估全局模型的性能:

# 使用测试集评估模型
evaluation = tff.learning.build_federated_evaluation(model_fn)# 对测试数据进行预处理,与训练数据使用相同的预处理函数
test_data = [preprocess(emnist_test.create_tf_dataset_for_client(client)) for client in emnist_test.client_ids[:5]
]# 评估模型
test_metrics = evaluation(state.model, test_data)print(f"测试集准确率: {test_metrics['sparse_categorical_accuracy']:.4f}")

在联邦学习的实战项目中,服务器和客户端的角色分工非常重要。以下是基于 TensorFlow Federated (TFF) 的联邦学习实验中,服务器和客户端的具体职责、代码运行逻辑以及数据流动的详细解释。

系统运行输出:

2025-03-04 18:27:03.432850: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2025-03-04 18:27:03.433171: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
训练集客户端数量: 3383
测试集客户端数量: 3383
2025-03-04 18:27:13.277749: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library nvcuda.dll
2025-03-04 18:27:13.311964: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: Quadro RTX 5000 computeCapability: 7.5
coreClock: 1.545GHz coreCount: 48 deviceMemorySize: 16.00GiB deviceMemoryBandwidth: 417.29GiB/s
2025-03-04 18:27:13.313521: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2025-03-04 18:27:13.314930: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cublas64_10.dll'; dlerror: cublas64_10.dll not found
2025-03-04 18:27:13.316281: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cufft64_10.dll'; dlerror: cufft64_10.dll not found
2025-03-04 18:27:13.317999: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library curand64_10.dll
2025-03-04 18:27:13.319563: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cusolver64_10.dll'; dlerror: cusolver64_10.dll not found
2025-03-04 18:27:13.321041: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cusparse64_10.dll'; dlerror: cusparse64_10.dll not found
2025-03-04 18:27:13.322479: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cudnn64_7.dll'; dlerror: cudnn64_7.dll not found
2025-03-04 18:27:13.322724: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1753] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
2025-03-04 18:27:16.089791: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations:  AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2025-03-04 18:27:16.098291: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x19c9bf209f0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2025-03-04 18:27:16.098611: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2025-03-04 18:27:16.099028: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1257] Device interconnect StreamExecutor with strength 1 edge matrix:
2025-03-04 18:27:16.099320: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1263]
指标结构: odict_keys(['broadcast', 'aggregation', 'train'])
Round 1, Loss: 2.3634, Accuracy: 0.0917
Round 2, Loss: 2.3296, Accuracy: 0.0917
Round 3, Loss: 2.3195, Accuracy: 0.0979
Round 4, Loss: 2.3126, Accuracy: 0.1104
Round 5, Loss: 2.3051, Accuracy: 0.1187
Round 6, Loss: 2.2987, Accuracy: 0.1500
Round 7, Loss: 2.2941, Accuracy: 0.1458
Round 8, Loss: 2.2898, Accuracy: 0.1292
Round 9, Loss: 2.2850, Accuracy: 0.1417
Round 10, Loss: 2.2797, Accuracy: 0.1521
测试集准确率: 0.1404

6. 实战项目补充说明

1. 联邦学习的整体架构
联邦学习的核心思想是“数据不动,模型动”。具体来说:

  • 客户端:每个客户端在本地拥有自己的数据,并使用这些数据训练模型。
  • 服务器:负责聚合来自多个客户端的模型更新,并生成全局模型。

整个流程可以分为以下几个阶段:

  1. 初始化:服务器初始化一个全局模型。
  2. 分发模型:服务器将全局模型发送给参与训练的客户端。
  3. 本地训练:客户端在本地数据上训练模型,并生成模型更新(如梯度或参数变化)。
  4. 上传更新:客户端将模型更新发送回服务器。
  5. 聚合更新:服务器对所有客户端的更新进行聚合,生成新的全局模型。
  6. 重复迭代:重复上述步骤,直到模型收敛。

2. 服务器端的代码与职责

职责

  • 初始化全局模型。
  • 接收客户端的模型更新。
  • 使用联邦平均算法(Federated Averaging, FedAvg)聚合客户端的模型更新。
  • 分发更新后的全局模型给客户端。

代码实现
以下是服务器端的主要代码逻辑:

# 定义联邦平均过程
iterative_process = tff.learning.algorithms.build_weighted_fed_avg(model_fn,  # 模型定义函数client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.02),  # 客户端优化器server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0)  # 服务器优化器
)# 初始化全局模型
state = iterative_process.initialize()# 进行多轮联邦训练
NUM_ROUNDS = 10
for round_num in range(1, NUM_ROUNDS + 1):# 随机选择部分客户端参与训练sampled_clients = emnist_train.client_ids[:5]  # 假设选择前5个客户端federated_train_data = [emnist_train.create_tf_dataset_for_client(client) for client in sampled_clients]# 执行一轮训练result = iterative_process.next(state, federated_train_data)state = result.state# 输出训练结果metrics = result.metrics['client_work']['train']print(f"Round {round_num}, Loss: {metrics['loss']:.4f}, Accuracy: {metrics['sparse_categorical_accuracy']:.4f}")

解释

  • model_fn 是一个函数,用于定义全局模型结构。
  • build_weighted_fed_avg 是 TFF 提供的联邦平均算法实现,用于在服务器端聚合客户端的模型更新。
  • iterative_process.next(state, federated_train_data) 是每轮训练的核心操作,服务器接收客户端的训练数据并更新全局模型。

3. 客户端的代码与职责

职责

  • 接收服务器分发的全局模型。
  • 使用本地数据对模型进行训练。
  • 将本地训练得到的模型更新(如梯度或参数变化)发送回服务器。

代码实现
客户端的训练逻辑由 TFF 自动封装,无需显式编写客户端代码。以下是一个简化的说明:

def model_fn():keras_model = create_keras_model()return tff.learning.from_keras_model(keras_model,input_spec=emnist_train.create_tf_dataset_for_client(emnist_train.client_ids[0]).element_spec,loss=tf.keras.losses.SparseCategoricalCrossentropy(),metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

解释

  • create_keras_model() 定义了客户端使用的模型结构。
  • tff.learning.from_keras_model() 将 Keras 模型转换为 TFF 兼容的格式。
  • 客户端的训练数据通过 emnist_train.create_tf_dataset_for_client(client) 获取,确保数据始终保留在本地。

4. 数据流动与角色分工

服务器端

  • 输入:客户端上传的模型更新(如梯度或参数变化)。

  • 输出:聚合后的全局模型。

  • 数据流动

    • 服务器将全局模型分发给客户端。
    • 服务器接收客户端上传的模型更新,并使用联邦平均算法进行聚合。

    客户端

  • 输入:服务器分发的全局模型。

  • 输出:本地训练生成的模型更新。

  • 数据流动

    • 客户端从服务器接收全局模型。
    • 客户端使用本地数据训练模型,并生成模型更新。
    • 客户端将模型更新上传到服务器。

5. 示例中的数据分布

在示例中,我们使用了 TensorFlow 提供的 EMNIST 数据集,该数据集被划分为多个客户端的数据子集。每个客户端的数据子集是独立的,且可能具有非独立同分布(Non-IID)特性。

数据加载

# 加载 EMNIST 数据集
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()# 查看数据集结构
print(f"训练集客户端数量: {len(emnist_train.client_ids)}")
print(f"测试集客户端数量: {len(emnist_test.client_ids)}")

数据分布特点

  • 每个客户端的数据子集通过 emnist_train.create_tf_dataset_for_client(client) 获取。
  • 不同客户端的数据可能是 Non-IID 的,例如某些客户端主要包含数字图像,而另一些客户端主要包含字母图像。

6. 项目小结

  • 服务器端:负责初始化全局模型、分发模型、接收客户端更新并聚合更新。
  • 客户端:负责使用本地数据训练模型,并将模型更新上传到服务器。
  • 数据流动:模型参数在服务器和客户端之间传递,而原始数据始终保留在客户端本地。
通过这种分工,联邦学习实现了数据隐私保护的同时,还能利用分布式计算资源完成模型训练。

三、图示:联邦学习架构与训练过程

1. 联邦学习架构图

以下是联邦学习的典型架构图:

+-------------------+       +-------------------+
|   客户端1         |       |   客户端2         |
| 数据保持本地      |       | 数据保持本地      |
+-------------------+       +-------------------+↓                         ↓+------------+           +------------+| 模型训练   |           | 模型训练   |+------------+           +------------+↓                         ↓+---------------------------------------------+| 中央服务器:模型参数聚合                   |+---------------------------------------------+↓+------------+| 全局模型更新 |+------------+
2. 训练过程示意图

以下是联邦学习的训练过程示意图:

初始模型 → 客户端1训练 → 客户端2训练 → ... → 参数上传 → 中央聚合 → 更新模型 → 下一轮训练
3. 如何提高模型准确率

提高联邦学习模型准确率的方法

目前模型的准确率确实较低(测试集准确率仅为14.04%),以下是几种可以提高准确率的方法:

1. 增加训练轮数

# 增加训练轮数
NUM_ROUNDS = 50  # 从10轮增加到50轮

2. 调整模型架构

def create_keras_model():return tf.keras.models.Sequential([tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),  # 添加更多卷积层tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),tf.keras.layers.Dropout(0.25),  # 添加Dropout防止过拟合tf.keras.layers.Flatten(),tf.keras.layers.Dense(256, activation='relu'),  # 增加神经元数量tf.keras.layers.Dropout(0.5),  # 添加Dropouttf.keras.layers.Dense(10, activation='softmax')])

3. 调整学习率和优化器

# 定义联邦平均过程
iterative_process = tff.learning.build_federated_averaging_process(model_fn,client_optimizer_fn=lambda: tf.keras.optimizers.Adam(learning_rate=0.001),  # 使用Adam优化器server_optimizer_fn=lambda: tf.keras.optimizers.Adam(learning_rate=0.1)  # 使用Adam优化器
)

4. 增加每轮参与训练的客户端数量

# 增加参与训练的客户端数量
sampled_clients = emnist_train.client_ids[:20]  # 从5个增加到20个

5. 增加每个客户端的批量大小

def preprocess(dataset):def batch_format_fn(element):return collections.OrderedDict([('x', tf.expand_dims(element['pixels'], axis=-1)),('y', element['label'])])return dataset.map(batch_format_fn).batch(64)  # 从20增加到64

6. 添加数据增强

def preprocess(dataset):def batch_format_fn(element):# 添加数据增强image = tf.expand_dims(element['pixels'], axis=-1)image = tf.image.random_flip_left_right(image)  # 随机水平翻转image = tf.image.random_brightness(image, 0.1)  # 随机亮度调整return collections.OrderedDict([('x', image),('y', element['label'])])return dataset.map(batch_format_fn).batch(32)

7. 使用预训练模型或迁移学习

如果可能,考虑使用在大型数据集上预训练的模型,然后在联邦学习环境中进行微调。

8. 实施更先进的联邦学习算法

考虑使用FedProx、FedAvgM等更先进的联邦学习算法,这些算法在处理非IID数据时表现更好。

建议从增加训练轮数和调整模型架构开始尝试,这些通常是提高准确率最直接的方法。


四、前沿关联:大模型在隐私保护方面的挑战与解决方案

1. 挑战
  • 数据隐私:大模型需要海量数据进行训练,但这些数据可能包含敏感信息。
  • 模型反推攻击:攻击者可以通过模型输出反推出训练数据的特征。
  • 合规性要求:如 GDPR 和 CCPA 等法规对数据隐私提出了严格要求。
2. 解决方案
  • 联邦学习:通过分布式训练保护数据隐私。
  • 差分隐私:在模型更新中引入噪声,降低反推风险。
  • 同态加密:确保数据和模型参数在传输和计算过程中始终加密。
  • 安全多方计算(Secure Multi-Party Computation, MPC):允许多方协作完成计算任务,同时保护各自的数据隐私。

总结

联邦学习是一种兼顾隐私保护与模型性能的分布式机器学习方法,尤其适用于数据分散且隐私敏感的场景。通过 TensorFlow Federated,我们可以轻松实现联邦学习实验,并结合差分隐私和同态加密进一步提升隐私保护能力。未来,随着大模型的普及,联邦学习将在更多领域发挥重要作用。

如果你对联邦学习感兴趣,不妨尝试运行上述代码,亲身体验其魅力!

相关文章:

《深度学习实战》第10集:联邦学习与隐私保护

第10集:联邦学习与隐私保护 2025年3月4日更新了代码,补充了实例程序运行截图 和 如何提高模型准确率的方法 系统梳理 集集精彩 代码验证 保证实战 随着数据隐私问题日益受到关注,联邦学习(Federated Learning) 作为一…...

如何解决跨域请求的问题(CORS)?

文章目录 1. 引言2. 理解 CORS2.1 CORS 基本概念2.2 同源策略与跨域分类 3. CORS 的核心机制3.1 预检请求(Preflight Request)3.2 简单请求 4. 服务器端配置 CORS4.1 关键响应头4.2 Node.js (Express) 示例4.3 其他后端语言配置 5. 前端处理 CORS 请求5.…...

【数据结构】二叉树总结篇

遍历 递归 递归三部曲: 1.参数和返回值 2.终止条件 3.单层逻辑(遍历顺序) var preorderTraversal function(root) { // 第一种let res[];const dfsfunction(root){if(rootnull)return ;//先序遍历所以从父节点开始res.push(root.val);//递归…...

软考-数据库开发工程师-3.1-数据结构-线性结构

第3章内容比较多,内容考试分数占比较大,6分左右 线性表 1、线性表的定义 一个线性表是n个元素的有限序列(n≥0),通常表示为(a1,a2, a3,…an). 2、线性表的顺序存储(顺序表) 是指用一组地址连续的存储单元依次存储线性表中的数据元…...

【五.LangChain技术与应用】【2.LangChain虚拟环境搭建(下):环境优化与调试】

一、Docker化部署:别让你的环境成为薛定谔的猫 经历过"在我机器上能跑"惨案的老铁都懂,传统虚拟环境就像个黑盒子。去年我帮客户部署LangChain应用,因为glibc版本差了0.1,整个服务直接崩成烟花。从那天起,我所有项目都强制上Docker! Dockerfile生存指南: #…...

deepseek+mermaid【自动生成流程图】

成果: 第一步打开deepseek官网(或百度版(更快一点)): 百度AI搜索 - 办公学习一站解决 第二步,生成对应的Mermaid流程图: 丢给deepseek代码,或题目要求 生成mermaid代码 第三步将代码复制到me…...

Java实现大数据量导出报表

一、实现方式 在Java中,导出数据到Excel有多种方式,每种方式都有其优缺点,适用于不同的场景。以下是常见的几种方式及其特点: 1.1 Apache POI Apache POI 是 Java 中最流行的库,支持读写 Excel 文件(包括…...

在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值

文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…...

Spring Boot 接口 JSON 序列化优化:忽略 Null 值的九种解决方案详解

一、针对特定接口null的处理&#xff1a; 方法一&#xff1a;使用 JsonInclude 注解 1.1 类级别&#xff1a;在接口返回的 ‌DTO 类或字段‌ 上添加 JsonInclude 注解&#xff0c;强制忽略 null 值&#xff1a; 类级别&#xff1a;所有字段为 null 时不返回 JsonInclude(Js…...

解码未来!安徽艾德未来智能科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!

在2025年“GAS消费电子科创奖”评选中&#xff0c;安徽艾德未来智能科技有限公司提交的“讯飞AI会议耳机iFLYBUDS Pro 2”&#xff0c;在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可&#xff0c;荣获“产品创新奖”。 这一殊荣不仅…...

Velox 之 Expression

Round 函数 velox/functions/prestosql/Arithmetic.h template <typename T> struct RoundFunction {template <typename TInput>FOLLY_ALWAYS_INLINE voidcall(TInput& result, const TInput& a, const int32_t b = 0) {result = round(a, b);} };/// R…...

【零基础到精通Java合集】第二十四集:ZGC收集器详解

课程标题:ZGC收集器——突破停顿时间极限的下一代垃圾回收器(15分钟) 目标:掌握ZGC的核心技术原理、适用场景与调优策略,理解其如何实现亚毫秒级停顿 0-1分钟:课程引入与ZGC设计目标 以“高速公路无障碍通行”类比ZGC核心思想:通过染色指针与读屏障技术,实现垃圾回收…...

力扣hot100刷题——栈

文章目录 69.有效的括号题目描述思路&#xff1a;栈code 70.最小栈题目描述思路&#xff1a;双栈法code优化&#xff1a;单栈法code 71.字符串解码题目描述思路&#xff1a;栈code 73.每日温度题目描述思路&#xff1a;单调栈code 74.柱状图中最大的矩形题目描述思路&#xff1…...

TMS320F28P550SJ9学习笔记2:Sysconfig 配置与点亮LED

今日学习使用Sysconfig 对引脚进行配置&#xff0c;并点亮开发板上的LED4 与LED5 我的单片机开发板平台是 LAUNCHXL_F28P55x 我是在上文描述的驱动库C2000ware官方例程example的工程基础之上进行添加功能的 该例程路径如下&#xff1a;D:\C2000Ware_5_04_00_00\driverlib\f28p…...

STM32MP1xx的启动流程

https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview 根据提供的知识库内容&#xff0c;以下是STM32 MPU启动链的详细解析&#xff1a; 1. 通用启动流程 STM32 MPU启动分为多阶段&#xff0c;逐步初始化外设和内存&#xff0c;并建立信任链&#xff1a; 1.1 ROM代码&…...

开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维

开源之夏经验分享&#xff5c;Koupleless 社区黄兴抗&#xff1a;在开源中培养工程思维 文|黄兴抗 电子信息工程专业 Koupleless 社区贡献者 就读于南昌师范学院&#xff0c;电子信息工程专业的大三学生。 本文 2634 字&#xff0c;预计阅读 7​ 分钟​ 今天 SOFAStack 邀…...

健康养生:开启活力人生的钥匙

在快节奏的现代生活中&#xff0c;健康养生已成为我们追求美好生活的关键。它不仅关乎身体的强健&#xff0c;更与心灵的宁静息息相关。 合理饮食是健康养生的基石。多吃蔬菜、水果&#xff0c;它们富含维生素与矿物质&#xff0c;为身体提供充足养分。全谷物食品也是不错的选…...

HTTP 与 HTTPS 协议:从基础到安全强化

引言 互联网的消息是如何传递的&#xff1f; 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议&#xff1a;互联网的基石 定义 HTTP&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;&#xff0c;即超文本传输协…...

项目工坊|Python驱动淘宝信息爬虫

目录 前言 1 完整代码 2 代码解读 2.1 导入模块 2.2 定义 TaoBao 类 2.3 search_infor_price_from_web 方法 2.3.1 获取下载路径 2.3.2 设置浏览器选项 2.3.3 反爬虫处理 2.3.4 启动浏览器 2.3.5 修改浏览器属性 2.3.6 设置下载行为 2.3.7 打开淘宝登录页面 2.3.…...

SQLite Alter 命令详解

SQLite Alter 命令详解 SQLite 是一种轻量级的数据库&#xff0c;广泛用于各种嵌入式系统、移动应用和小型项目。SQLite 的ALTER TABLE命令用于修改已存在的表结构&#xff0c;包括添加、删除或修改列&#xff0c;以及重命名表等操作。本文将详细解析SQLite的ALTER TABLE命令&…...

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机&#xff0c;如笔记本等都是按照冯诺依曼来设计的&#xff1a; 截止目前&#xff0c;我们所知道的计算机都是由一个一个的硬件组装起来的&#xff0c;这些硬件又由于功能的不同被分为了输入设备&#xff0c;输出设备&#xff0c;存储器…...

mapbox进阶,使用点类型geojson加载symbol符号图层,用于标注带图标的注记,且文字居中在图标内,图标大小自适应文字

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…...

布隆过滤器(附带位图讲解)

提到位图&#xff0c;我们首先想到的应该是它的两面定义&#xff1a; 位图图像&#xff08;bitmap&#xff09;&#xff0c;亦称为点阵图或栅格图像&#xff0c;是由称作像素&#xff08;图片元素&#xff09;的单个点组成的。位图是指内存中连续的二进制位&#xff0c;用于对…...

【芯片设计】AI偏车载芯片前端设计工程师面试记录·20250304

【芯片前端设计面试经验专栏介绍】 专栏聚焦数字芯片前端设计核心技术与面试方法论,涵盖架构设计、RTL开发、验证方法学、低功耗设计、时序收敛等高频考点,深入解析行业头部企业的面试真题与设计场景。内容包含但不限于: 知识点系统梳理 :从Verilog/SV语法陷阱、FSM设计模式…...

2024北京理工大学计算机复试上机真题

2024北京理工大学计算机复试上机真题 2024北京理工大学计算机考研复试上机真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 等腰梯形 题目描述 请输入高度h&#xff0c;输入一个高为h&#xff0c;上底边长为h的等腰梯形&#xff08;例如h4&#xff0c;图形…...

CC++的内存管理

目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈&#xff1a;存有非静态局部变量、函数参数、返回…...

Redis是什么?如何使用Redis进行缓存操作?

Redis&#xff08;Remote Dictionary Server&#xff09;是一款高性能的内存键值存储系统&#xff0c;广泛用于缓存、消息队列、会话存储和实时数据处理等场景。它基于内存存储&#xff0c;支持多种数据结构&#xff0c;如字符串、列表、集合、有序集合和哈希表等&#xff0c;具…...

【商城实战(2)】商城架构设计:从底层逻辑到技术实现

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

USB 模块 全面解析(一)

本文是我整理的一些 USB 的学习心得&#xff0c;希望能对大家有所帮助。 文章目录 前言&#x1f352; USB 基本概述&#x1f352; USB 结构框架&#x1f349;硬件框架&#x1f349; 软件框架 &#x1f352; USB 电气信号&#x1f349; USB 硬件线路&#x1f349; 信号电平&…...

xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研

目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时&#xff1a; 对传入的视频有如下要求&#xff1a; 对传入的视频建议&#xff1a; 识别物体规范 为提高Marker质量&#xff0c;保证算法识别效果&#xff0c;可参考Marker规范文档 Marker规…...