卷积神经网络认证训练:防御卷积扰动的PyTorch实战指南
在深度学习模型的安全性和鲁棒性研究领域对抗性攻击一直是开发者面临的重要挑战。最近在ICLR 2024会议上提出的Certified Training for Convolutional Perturbations方法为卷积神经网络提供了一种全新的认证训练框架能够有效防御各种卷积扰动攻击。本文将深入解析这一技术的核心原理并提供完整的PyTorch实现方案帮助开发者从理论到实践全面掌握这一前沿技术。1. 卷积扰动攻击的背景与挑战1.1 什么是卷积扰动攻击卷积扰动攻击是一种新型的对抗性攻击方式与传统像素级扰动不同它通过在输入图像上应用卷积核来生成扰动。这种攻击方式更加符合现实世界中的图像退化情况如运动模糊、镜头失焦等自然现象因此具有更强的实际威胁性。卷积扰动的数学表达式为import torch import torch.nn as nn def apply_convolutional_perturbation(x, kernel): 应用卷积扰动到输入图像 Args: x: 输入图像张量 [batch, channels, height, width] kernel: 卷积核 [out_channels, in_channels, kernel_size, kernel_size] Returns: 扰动后的图像 # 确保卷积核与输入通道数匹配 if kernel.size(1) ! x.size(1): kernel kernel.repeat(1, x.size(1)//kernel.size(1), 1, 1) # 应用卷积操作 perturbed_x nn.functional.conv2d(x, kernel, paddingkernel.size(-1)//2) return perturbed_x1.2 传统防御方法的局限性传统的对抗训练方法主要针对像素级的Lp范数有界扰动如FGSM、PGD等攻击。然而这些方法在面对卷积扰动时往往效果有限因为卷积扰动改变了图像的整体结构特征而不仅仅是局部像素值。主要局限性包括无法有效建模卷积操作的全局影响认证保证仅限于特定类型的扰动计算复杂度随扰动空间维度指数增长2. Certified Training的核心原理2.1 认证训练的基本概念认证训练的目标是为神经网络提供可证明的鲁棒性保证即在特定的扰动范围内模型对任何扰动都能保持正确的预测结果。对于卷积扰动认证训练需要确保模型对任何满足约束条件的卷积核扰动都具有鲁棒性。2.2 卷积扰动的数学建模卷积扰动可以表示为对输入图像的线性变换。设原始图像为x∈R^(H×W×C)卷积核为k∈R^(k×k)则扰动后的图像为x x ∗ k其中∗表示卷积操作。认证训练的关键在于约束卷积核的可行空间class ConvolutionalPerturbationSet: def __init__(self, kernel_size, norm_bound, input_size): self.kernel_size kernel_size self.norm_bound norm_bound # 卷积核的范数约束 self.input_size input_size def sample_valid_kernels(self, batch_size): 采样满足约束的卷积核 kernels torch.randn(batch_size, 1, self.kernel_size, self.kernel_size) # 归一化到满足范数约束 kernel_norms torch.norm(kernels.view(batch_size, -1), dim1) scale self.norm_bound / torch.clamp(kernel_norms, min1e-8) kernels kernels * scale.view(-1, 1, 1, 1) return kernels2.3 认证鲁棒性的形式化定义对于分类任务认证鲁棒性要求对于所有满足约束的卷积扰动模型的预测结果保持一致∀k ∈ K: argmax f(x ∗ k) argmax f(x)其中K表示满足约束的卷积核集合f为分类模型。3. 环境准备与依赖配置3.1 硬件和软件要求实现认证训练需要适当的计算资源建议配置GPU: NVIDIA GPU with ≥8GB VRAMRAM: ≥16GBPython: 3.8PyTorch: 1.93.2 依赖库安装pip install torch1.9.0 pip install torchvision0.10.0 pip install numpy1.21.0 pip install matplotlib3.5.0 pip install tqdm4.62.03.3 项目结构规划certified_conv_training/ ├── src/ │ ├── models/ # 模型定义 │ ├── perturbations/ # 扰动生成 │ ├── training/ # 训练逻辑 │ └── certification/ # 认证计算 ├── configs/ # 配置文件 ├── data/ # 数据集 └── scripts/ # 训练脚本4. 认证训练算法实现4.1 核心算法框架认证训练的核心思想是在训练过程中考虑最坏情况下的扰动从而提升模型的鲁棒性。算法流程如下import torch import torch.nn as nn from torch.utils.data import DataLoader class CertifiedConvTrainer: def __init__(self, model, perturbation_set, optimizer, criterion): self.model model self.perturbation_set perturbation_set self.optimizer optimizer self.criterion criterion def compute_certified_loss(self, x, y): 计算认证损失 batch_size x.size(0) # 采样多个卷积核 kernels self.perturbation_set.sample_valid_kernels(batch_size) # 应用扰动并计算最坏情况损失 worst_case_loss 0 for i in range(kernels.size(0)): perturbed_x apply_convolutional_perturbation(x, kernels[i:i1]) outputs self.model(perturbed_x) loss self.criterion(outputs, y) worst_case_loss torch.max(worst_case_loss, loss) return worst_case_loss def train_epoch(self, dataloader): 训练一个epoch self.model.train() total_loss 0 for batch_idx, (data, target) in enumerate(dataloader): data, target data.cuda(), target.cuda() self.optimizer.zero_grad() loss self.compute_certified_loss(data, target) loss.backward() self.optimizer.step() total_loss loss.item() if batch_idx % 100 0: print(fBatch {batch_idx}, Loss: {loss.item():.6f}) return total_loss / len(dataloader)4.2 高效的扰动采样策略为了降低计算复杂度需要设计高效的采样策略class EfficientPerturbationSampler: def __init__(self, kernel_size, num_samples, norm_bound): self.kernel_size kernel_size self.num_samples num_samples self.norm_bound norm_bound def generate_orthogonal_basis(self): 生成正交基向量用于高效采样 # 使用随机正交矩阵构建基向量 basis torch.randn(self.num_samples, self.kernel_size * self.kernel_size) q, r torch.linalg.qr(basis) # QR分解得到正交基 return q * self.norm_bound def sample_on_sphere(self, center, radius): 在球面上均匀采样 # 使用高斯分布归一化得到球面均匀分布 samples torch.randn(self.num_samples, self.kernel_size * self.kernel_size) samples samples / torch.norm(samples, dim1, keepdimTrue) return center radius * samples5. 模型架构设计与优化5.1 鲁棒性增强的CNN架构针对卷积扰动特性需要设计特殊的网络架构class RobustCNN(nn.Module): def __init__(self, num_classes10): super(RobustCNN, self).__init__() # 使用更大的卷积核增强空间不变性 self.conv1 nn.Conv2d(3, 64, kernel_size7, stride2, padding3) self.bn1 nn.BatchNorm2d(64) # 残差连接增强梯度流动 self.resblock1 ResidualBlock(64, 128) self.resblock2 ResidualBlock(128, 256) # 全局平均池化替代全连接层 self.global_avg_pool nn.AdaptiveAvgPool2d((1, 1)) self.fc nn.Linear(256, num_classes) # 激活函数选择 self.activation nn.ReLU(inplaceTrue) def forward(self, x): x self.activation(self.bn1(self.conv1(x))) x self.resblock1(x) x self.resblock2(x) x self.global_avg_pool(x) x x.view(x.size(0), -1) x self.fc(x) return x class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels): super(ResidualBlock, self).__init__() self.conv1 nn.Conv2d(in_channels, out_channels, 3, padding1) self.bn1 nn.BatchNorm2d(out_channels) self.conv2 nn.Conv2d(out_channels, out_channels, 3, padding1) self.bn2 nn.BatchNorm2d(out_channels) self.activation nn.ReLU(inplaceTrue) # shortcut连接 if in_channels ! out_channels: self.shortcut nn.Conv2d(in_channels, out_channels, 1) else: self.shortcut nn.Identity() def forward(self, x): residual self.shortcut(x) out self.activation(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) out residual return self.activation(out)5.2 训练策略优化class AdaptiveTrainingScheduler: def __init__(self, initial_norm_bound, final_norm_bound, total_epochs): self.initial_norm_bound initial_norm_bound self.final_norm_bound final_norm_bound self.total_epochs total_epochs def get_norm_bound(self, epoch): 随着训练进度调整扰动范数边界 progress epoch / self.total_epochs # 线性衰减策略 current_bound self.initial_norm_bound - progress * ( self.initial_norm_bound - self.final_norm_bound) return max(current_bound, self.final_norm_bound)6. 完整训练流程实现6.1 数据预处理与加载import torchvision import torchvision.transforms as transforms def get_cifar10_dataloaders(batch_size128): 获取CIFAR-10数据加载器 transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) trainset torchvision.datasets.CIFAR10( root./data, trainTrue, downloadTrue, transformtransform_train) trainloader DataLoader(trainset, batch_sizebatch_size, shuffleTrue, num_workers4) testset torchvision.datasets.CIFAR10( root./data, trainFalse, downloadTrue, transformtransform_test) testloader DataLoader(testset, batch_sizebatch_size, shuffleFalse, num_workers4) return trainloader, testloader6.2 主训练循环def main_training_loop(): # 初始化配置 device torch.device(cuda if torch.cuda.is_available() else cpu) batch_size 128 epochs 200 initial_norm_bound 2.0 final_norm_bound 0.5 # 准备数据 train_loader, test_loader get_cifar10_dataloaders(batch_size) # 初始化模型和优化器 model RobustCNN(num_classes10).to(device) optimizer torch.optim.SGD(model.parameters(), lr0.1, momentum0.9, weight_decay5e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxepochs) criterion nn.CrossEntropyLoss() # 初始化训练器 norm_scheduler AdaptiveTrainingScheduler(initial_norm_bound, final_norm_bound, epochs) # 训练循环 for epoch in range(epochs): current_norm_bound norm_scheduler.get_norm_bound(epoch) perturbation_set ConvolutionalPerturbationSet( kernel_size5, norm_boundcurrent_norm_bound, input_size32) trainer CertifiedConvTrainer(model, perturbation_set, optimizer, criterion) # 训练一个epoch train_loss trainer.train_epoch(train_loader) # 评估模型 test_acc evaluate_model(model, test_loader, device) # 调整学习率 scheduler.step() print(fEpoch {epoch1}/{epochs}, Loss: {train_loss:.4f}, Test Acc: {test_acc:.2f}%) # 保存最佳模型 if test_acc best_acc: torch.save(model.state_dict(), best_model.pth) best_acc test_acc def evaluate_model(model, test_loader, device): 评估模型性能 model.eval() correct 0 total 0 with torch.no_grad(): for data, target in test_loader: data, target data.to(device), target.to(device) outputs model(data) _, predicted torch.max(outputs.data, 1) total target.size(0) correct (predicted target).sum().item() return 100 * correct / total7. 认证鲁棒性评估7.1 认证准确率计算认证准确率是指在最坏扰动下模型仍能保持正确预测的比例def compute_certified_accuracy(model, test_loader, perturbation_set, device): 计算认证准确率 model.eval() certified_correct 0 total 0 for data, target in test_loader: data, target data.to(device), target.to(device) batch_size data.size(0) # 对每个样本测试多个扰动 for i in range(batch_size): sample data[i:i1] label target[i:i1] # 生成多个扰动版本 kernels perturbation_set.sample_valid_kernels(100) all_correct True for j in range(kernels.size(0)): perturbed_sample apply_convolutional_perturbation(sample, kernels[j:j1]) output model(perturbed_sample) pred output.argmax(dim1) if pred ! label: all_correct False break if all_correct: certified_correct 1 total 1 return 100 * certified_correct / total7.2 可视化分析工具import matplotlib.pyplot as plt import numpy as np def visualize_perturbation_effects(original_img, perturbed_imgs, kernels): 可视化扰动效果 fig, axes plt.subplots(2, 5, figsize(15, 6)) # 显示原始图像 axes[0, 0].imshow(original_img.permute(1, 2, 0).cpu().numpy()) axes[0, 0].set_title(Original Image) axes[0, 0].axis(off) # 显示扰动后的图像 for i in range(4): axes[0, i1].imshow(perturbed_imgs[i].permute(1, 2, 0).cpu().numpy()) axes[0, i1].set_title(fPerturbed {i1}) axes[0, i1].axis(off) # 显示使用的卷积核 for i in range(5): kernel_vis kernels[i].squeeze().cpu().numpy() axes[1, i].imshow(kernel_vis, cmapcoolwarm) axes[1, i].set_title(fKernel {i1}) axes[1, i].axis(off) plt.tight_layout() plt.show()8. 实际应用与性能优化8.1 大规模数据集上的扩展当处理更大规模的数据集如ImageNet时需要考虑计算效率的优化class DistributedCertifiedTraining: def __init__(self, model, perturbation_set, num_gpus4): self.model model self.perturbation_set perturbation_set self.num_gpus num_gpus def parallel_perturbation_computation(self, x): 并行计算多个扰动版本 batch_size x.size(0) # 将批次数据分配到多个GPU x_split torch.chunk(x, self.num_gpus, dim0) results [] for i, x_part in enumerate(x_split): device fcuda:{i} x_part x_part.to(device) model_part self.model.to(device) # 在每个GPU上计算扰动损失 kernels self.perturbation_set.sample_valid_kernels(x_part.size(0)) perturbed_x apply_convolutional_perturbation(x_part, kernels) outputs model_part(perturbed_x) results.append(outputs.to(cuda:0)) return torch.cat(results, dim0)8.2 内存优化技巧class MemoryEfficientCertification: def __init__(self, model, gradient_checkpointingTrue): self.model model self.gradient_checkpointing gradient_checkpointing def compute_loss_with_checkpointing(self, x, y, kernels): 使用梯度检查点减少内存使用 def create_custom_forward(module): def custom_forward(*inputs): return module(*inputs) return custom_forward total_loss 0 for i in range(kernels.size(0)): perturbed_x apply_convolutional_perturbation(x, kernels[i:i1]) if self.gradient_checkpointing: # 使用梯度检查点 outputs torch.utils.checkpoint.checkpoint( create_custom_forward(self.model), perturbed_x) else: outputs self.model(perturbed_x) loss nn.functional.cross_entropy(outputs, y) total_loss loss return total_loss / kernels.size(0)9. 常见问题与解决方案9.1 训练不收敛问题问题现象损失函数震荡或持续上升准确率不提升。可能原因扰动范数边界设置过大学习率设置不合理模型容量不足解决方案def adaptive_hyperparameter_tuning(): 自适应超参数调整策略 # 动态调整学习率 optimizer torch.optim.SGD(model.parameters(), lr0.1) scheduler torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, modemin, patience5, factor0.5) # 渐进式增加扰动强度 def get_adaptive_norm_bound(epoch, max_epochs): if epoch max_epochs * 0.3: return 0.5 # 初始阶段使用较小扰动 elif epoch max_epochs * 0.6: return 1.0 # 中期适度增加 else: return 2.0 # 后期使用完整扰动9.2 认证准确率过低问题现象标准准确率尚可但认证准确率显著下降。可能原因扰动空间采样不足模型架构不适合认证训练训练时间不足优化策略增加扰动采样数量使用更鲁棒的模型架构延长训练时间并配合适当的数据增强10. 生产环境最佳实践10.1 模型部署考虑在将认证训练模型部署到生产环境时需要注意class ProductionCertifiedModel: def __init__(self, model_path, perturbation_constraints): self.model torch.load(model_path) self.model.eval() self.perturbation_constraints perturbation_constraints def predict_with_certification(self, x, num_samples1000): 带认证保证的预测 predictions [] certifications [] with torch.no_grad(): for i in range(x.size(0)): sample x[i:i1] original_pred self.model(sample).argmax() # 测试多个扰动 kernels self.sample_valid_kernels(num_samples) certified True for kernel in kernels: perturbed apply_convolutional_perturbation(sample, kernel.unsqueeze(0)) perturbed_pred self.model(perturbed).argmax() if perturbed_pred ! original_pred: certified False break predictions.append(original_pred.item()) certifications.append(certified) return predictions, certifications10.2 监控与维护建立完整的监控体系定期评估模型在最新攻击下的表现监控认证准确率的变化趋势建立模型更新和回滚机制认证训练为卷积神经网络提供了可证明的安全保证特别是在面对现实世界的图像退化问题时表现出色。通过本文的完整实现方案开发者可以快速将这一前沿技术应用到实际项目中提升模型的鲁棒性和可靠性。

相关新闻

AI生成内容检测:三维度定向爆破技术解析

AI生成内容检测:三维度定向爆破技术解析

1. 项目概述:当AI生成内容遇上定向爆破 最近在内容安全审核领域,一个叫"三维度定向爆破降AI"的技术方案突然火了。这本质上是一套针对AI生成内容的检测与干预系统,通过句法、语义、逻辑三个维度的联合分析,实现对机器生…

2026/8/14 7:33:24 阅读更多 →
TI ADS7851EVM-PDK评估套件:同步采样ADC性能验证与设计实战

TI ADS7851EVM-PDK评估套件:同步采样ADC性能验证与设计实战

1. 项目概述与核心价值 在嵌入式系统、工业自动化或者精密仪器设计领域,我们常常会遇到一个核心挑战:如何精准、同步地捕获来自多个传感器的模拟信号,并将其转换为可供处理器分析的数字数据。无论是三相电机的电流电压监控、多通道振动分析&a…

2026/8/17 22:35:49 阅读更多 →
汉诺塔递归算法精解:从C/C++实现到调用栈深度剖析

汉诺塔递归算法精解:从C/C++实现到调用栈深度剖析

1. 项目概述:从“搬盘子”到理解递归的桥梁汉诺塔问题,一个听起来有点古典的计算机科学入门题,却是我在面试新人、带实习生时最爱抛出的“试金石”。它远不止是教科书上那个关于“递归”的经典案例。当你用C或C去实现它时,你会发现…

2026/8/18 7:12:14 阅读更多 →

最新新闻

基于Arduino的智能自行车尾灯DIY:从电路设计到程序实现

基于Arduino的智能自行车尾灯DIY:从电路设计到程序实现

1. 项目概述:为什么用Arduino做自行车尾灯?如果你和我一样,既喜欢骑车通勤或夜骑,又对电子制作有点手痒,那这个项目绝对能让你玩得开心。市面上现成的自行车尾灯,功能要么太单一(常亮或简单闪烁…

2026/8/19 2:54:02 阅读更多 →
FreeRTOS链表实现解析:从数据结构到任务调度实战

FreeRTOS链表实现解析:从数据结构到任务调度实战

1. 从“任务调度”到“数据组织”:为什么FreeRTOS离不开链表如果你刚开始接触FreeRTOS,可能会觉得它最核心、最酷的部分是那个神奇的任务调度器——它能让多个任务看起来像在同时运行。没错,任务调度是它的心脏。但如果你再深入一层&#xff…

2026/8/19 2:54:02 阅读更多 →
基于ATtiny1614与WS2812B的欧姆钟设计:嵌入式开发与LED驱动实践

基于ATtiny1614与WS2812B的欧姆钟设计:嵌入式开发与LED驱动实践

1. 项目缘起:为什么我们需要一个“欧姆钟”?几年前,我在一个极客论坛上看到一个项目,叫“Nixie Clock”(辉光管时钟)。那种复古的、带着橘红色暖光的数字,配合裸露的电子管和手工焊接的电路板&a…

2026/8/19 2:54:02 阅读更多 →
基于micro-ROS与Raspberry Pi Pico的HC-SR04超声波传感器ROS 2节点开发实践

基于micro-ROS与Raspberry Pi Pico的HC-SR04超声波传感器ROS 2节点开发实践

1. 项目缘起:当经典超声波模块遇上现代机器人框架最近在捣鼓一个需要自主避障的小车项目,核心需求是让小车能实时感知前方障碍物的距离。手头正好有几个吃灰已久的HC-SR04超声波模块,这几乎是每个嵌入式爱好者入门传感器时的“老朋友”了。它…

2026/8/19 2:54:02 阅读更多 →
单片机驱动VGA显示:从时序原理到嵌入式图形系统实践

单片机驱动VGA显示:从时序原理到嵌入式图形系统实践

1. 项目概述:Vectron VGA Plus是什么?如果你和我一样,对老式计算机、复古硬件或者用微控制器驱动老式显示器有浓厚的兴趣,那么“Vectron VGA Plus”这个名字你肯定不会陌生。它不是一个商业产品,而是一个在复古计算和硬…

2026/8/19 2:54:02 阅读更多 →
FreeRTOS任务调度核心机制:抢占式、时间片与协作式调度详解

FreeRTOS任务调度核心机制:抢占式、时间片与协作式调度详解

1. 从“单打独斗”到“多任务协作”:为什么我们需要任务调度?如果你刚开始接触嵌入式开发,可能习惯了在一个main函数的while(1)循环里,用一堆if和switch语句来轮询处理各种事件——比如检查按键、刷新屏幕、读取传感器。这种方式简…

2026/8/19 2:53:01 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →