从异或问题到两层感知机:理解神经网络非线性能力的经典案例
1. 项目概述为什么“异或”是感知机的试金石在机器学习入门领域有一个绕不开的经典问题它就像一道“龙门”区分了线性模型与非线性模型的能力边界——这就是异或问题。我第一次接触这个问题时也以为一个简单的感知机就能搞定结果被现实狠狠上了一课。异或这个在逻辑电路里再基础不过的运算对于单层感知机来说却是一道无法逾越的天堑。今天我们就来彻底拆解这个经典案例看看如何用“两层感知机”或者说一个最简单的多层感知机MLP来攻克它。这不仅是一个数学游戏更是理解神经网络如何从线性走向非线性的关键一步。简单来说异或运算的规则是两个输入相同时输出0不同时输出1。用真值表表示就是 (0,0)-0, (0,1)-1, (1,0)-1, (1,1)-0。如果你尝试在二维平面上画出这四个点并把输出为1和0的点用不同颜色标记你会发现你无法用一根直线把这两类点完美分开。这就是问题的核心单层感知机一个线性分类器只能解决线性可分问题而异或问题是线性不可分的。因此我们必须引入“层”的概念通过增加一个隐藏层让网络具备组合特征、构造非线性决策边界的能力。这个项目就是手动搭建并训练一个最小的神经网络亲身体验从“无法解决”到“迎刃而解”的思维跃迁。2. 核心原理拆解从线性不可分到非线性映射要理解两层感知机如何解决异或我们必须先深入其数学本质。单层感知机无隐藏层的运算可以表示为y f(w·x b)其中f通常是阶跃函数。这本质上是在做线性变换后加一个非线性激活。无论你怎么调整权重w和偏置b其决策边界永远是一条直线或高维空间中的超平面。2.1 异或问题的线性不可分性证明我们可以用反证法直观理解。假设存在一组权重(w1, w2)和偏置b使得阶跃函数能正确分类异或的四个点。那么需要满足以下四个不等式对于 (0,0):w1*0 w2*0 b 0b 0对于 (1,1):w1*1 w2*1 b 0w1 w2 b 0对于 (0,1):w1*0 w2*1 b 0w2 b 0对于 (1,0):w1*1 w2*0 b 0w1 b 0将不等式3和4相加得到(w1 w2) 2b 0。但我们从不等式1知道b 0所以2b是一个负数。为了让和大于等于0(w1 w2)必须是一个足够大的正数。然而不等式2要求(w1 w2) b 0这意味着(w1 w2)必须小于-b一个正数。这就产生了矛盾(w1 w2)既需要很大以满足(w1 w2) 2b 0同时又需要很小以满足(w1 w2) b 0。因此不存在这样的权重和偏置。这个严谨的证明清晰地告诉我们单层结构是死路一条。2.2 两层感知机的破局思路空间变换两层感知机的核心思想是“空间变换”。第一层隐藏层的作用是将原始输入空间中的点映射到一个新的特征空间。在这个新空间里原本线性不可分的问题变得线性可分了。然后第二层输出层在这个新空间里简单地画一条直线做线性分类即可。对于异或问题一个经典的、可以手动构造的映射方式是隐藏层第一个神经元学习“逻辑与非”NANDh1 (NOT (x1 AND x2))。当且仅当x1和x2都是1时输出0其他情况输出1。隐藏层第二个神经元学习“逻辑或”ORh2 (x1 OR x2)。当x1或x2为1时输出1全0时输出0。现在我们看看经过这层变换后原始输入(x1, x2)变成了什么(0,0) - (h11, h20)(0,1) - (h11, h21)(1,0) - (h11, h21)(1,1) - (h10, h21)如果我们把(h1, h2)作为新的坐标画在平面上你会发现目标输出为1的点[(1,1), (1,1)]实际上是同一个点而输出为0的点[(1,0), (0,1)]是另外两个点。现在我们很容易用一条直线例如h1 - h2 0.5来区分它们。输出层要学习的正是这个在新空间里的线性分类器。注意这里为了解释原理我们用了完美的逻辑门作为隐藏层函数。在实际的神经网络训练中我们使用可微的激活函数如Sigmoid、ReLU和梯度下降让网络自己从数据中学习出类似功能的特征表示而不是我们手动指定。但原理是相通的隐藏层学习到有用的中间特征。3. 网络架构设计与实现细节理解了原理我们来设计一个具体的、可以训练的两层感知机。这里我们选择最经典的配置以便清晰地展示每一步。3.1 网络结构定义我们的网络结构如下输入层2个神经元对应x1和x2。隐藏层2个神经元。这是解决异或问题的最小隐藏层规模。每个神经元采用Sigmoid激活函数将输出压缩到(0,1)区间模拟“激活”的概率。输出层1个神经元同样使用Sigmoid激活函数输出一个0到1之间的值我们可以设定阈值0.5来判定最终分类0.5为10.5为0。为什么隐藏层用2个神经元从上面的原理分析可知至少需要两个特征来构造新空间。为什么用Sigmoid而不用更现代的ReLU对于这个极小的、数据完全确定的二分类问题Sigmoid的输出范围(0,1)与目标(0,1)完美匹配且梯度平滑更容易让小网络收敛。在实际大型网络中ReLU可能更好但在此处Sigmoid的教学意义和稳定性更佳。3.2 前向传播过程前向传播就是数据从输入到输出的计算过程。我们用向量和矩阵表示会更清晰。设输入向量X [x1, x2]隐藏层权重矩阵W1(形状 2x2)偏置向量b1(形状 2x1)输出层权重向量W2(形状 2x1)偏置标量b2(形状 1x1)则前向传播公式为隐藏层输入Z1 X · W1 b1点乘隐藏层输出A1 sigmoid(Z1)输出层输入Z2 A1 · W2 b2网络最终输出A2 sigmoid(Z2)sigmoid函数的定义为σ(z) 1 / (1 e^{-z})。它的导数有一个很好的性质σ(z) σ(z) * (1 - σ(z))这在反向传播时会用到。3.3 损失函数与优化目标我们需要一个函数来衡量网络输出A2与真实标签Y之间的差距。对于二分类问题二元交叉熵损失是最自然的选择。对于一个样本其损失为L - [Y * log(A2) (1-Y) * log(1-A2)]对于我们的异或数据集四个样本总损失就是四个样本损失的平均值。我们的训练目标就是通过调整参数W1, b1, W2, b2使这个总损失最小化。4. 手动训练过程从零推导梯度下降现在我们不用任何深度学习框架手动实现一次梯度下降来深刻理解参数是如何被更新的。这是理解神经网络精髓的关键。4.1 反向传播梯度推导反向传播的核心是链式法则。我们需要求出损失L对每一个参数W2, b2, W1, b1的偏导数。首先定义几个中间变量方便求导输出层误差δ2 ∂L / ∂Z2 (A2 - Y)这是Sigmoid交叉熵损失组合的一个优美性质推导略隐藏层误差δ1 (δ2 · W2^T) * A1 * (1 - A1)。这里*是元素乘W2^T是W2的转置。A1 * (1-A1)正是sigmoid(Z1)的导数。然后各参数的梯度就很容易得到了∂L / ∂W2 A1^T · δ2∂L / ∂b2 δ2注意求和因为b2作用于所有样本实际是δ2的和∂L / ∂W1 X^T · δ1∂L / ∂b1 δ1同样要求和实操心得第一次手动推导这些梯度时很容易在矩阵形状和转置上犯错。一个黄金法则是每个参数梯度的形状必须和该参数本身的形状完全一致。例如W1是2x2那么∂L/∂W1也必须是2x2。用这个规则可以快速检查推导的正确性。4.2 参数初始化与更新参数不能全部初始化为0这会导致对称性破坏所有神经元学不到不同的特征。我们采用简单的“小随机数”初始化比如从均值为0、标准差为0.1的正态分布中采样。更新公式就是梯度下降参数 参数 - 学习率 * 梯度。学习率是一个超参数需要仔细选择。对于这个小问题学习率设在0.1到0.5之间通常比较合适。让我们模拟一下前几轮迭代。假设初始化后输入(0,1)网络输出是0.6目标是1那么损失为正。通过反向传播计算梯度W2中与当前活跃的隐藏层神经元输出值大的相连的权重会被更新使得下次面对类似输入时输出更接近1。同时W1也会被更新以改变隐藏层神经元的“活跃模式”使其提取的特征更有利于最终的分类。4.3 训练循环与收敛判断我们将四个异或样本组成一个训练批次进行迭代训练。在每次迭代epoch中对每个样本进行前向传播计算输出和损失。累积四个样本的梯度或计算平均梯度。用平均梯度更新所有参数。如何判断收敛我们可以监控两项总损失随着训练进行损失值应该持续下降最终趋近于0因为这个问题是确定性的、可完美拟合的。分类准确率计算网络输出四舍五入后与真实标签一致的样本比例。我们的目标是达到100%。由于网络很小数据很简单通常几十到几百次迭代就能完美收敛。如果损失震荡不降很可能是学习率设得太高了如果下降极其缓慢则可能是学习率太低或初始化不当。5. Python代码实现与逐行解析理论说再多不如一行代码。下面我们用纯NumPy来实现这个两层感知机并加上详细注释。import numpy as np # 定义Sigmoid函数及其导数用于反向传播 def sigmoid(x): return 1 / (1 np.exp(-x)) def sigmoid_derivative(x): return x * (1 - x) # 异或问题的输入和标签 X np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) Y np.array([[0], [1], [1], [0]]) # 注意是列向量 # 超参数设置 input_neurons 2 hidden_neurons 2 output_neurons 1 learning_rate 0.5 epochs 10000 # 参数初始化小随机数 np.random.seed(42) # 固定随机种子确保结果可复现 W1 np.random.randn(input_neurons, hidden_neurons) * 0.1 b1 np.zeros((1, hidden_neurons)) W2 np.random.randn(hidden_neurons, output_neurons) * 0.1 b2 np.zeros((1, output_neurons)) # 训练循环 for epoch in range(epochs): # --- 前向传播 --- # 隐藏层 Z1 np.dot(X, W1) b1 # (4,2) · (2,2) - (4,2) A1 sigmoid(Z1) # 隐藏层输出 # 输出层 Z2 np.dot(A1, W2) b2 # (4,2) · (2,1) - (4,1) A2 sigmoid(Z2) # 网络最终输出 # --- 计算损失二元交叉熵 --- loss -np.mean(Y * np.log(A2 1e-8) (1 - Y) * np.log(1 - A2 1e-8)) # 添加一个极小值1e-8防止log(0)出现数学错误这是实战中的常用技巧 # --- 反向传播 --- # 输出层误差 dZ2 A2 - Y # (4,1) # 输出层梯度 dW2 np.dot(A1.T, dZ2) / X.shape[0] # (2,4) · (4,1) - (2,1), 除以样本数求平均梯度 db2 np.sum(dZ2, axis0, keepdimsTrue) / X.shape[0] # (1,1) # 隐藏层误差 dA1 np.dot(dZ2, W2.T) # (4,1) · (1,2) - (4,2) dZ1 dA1 * sigmoid_derivative(A1) # (4,2) 元素乘 # 隐藏层梯度 dW1 np.dot(X.T, dZ1) / X.shape[0] # (2,4) · (4,2) - (2,2) db1 np.sum(dZ1, axis0, keepdimsTrue) / X.shape[0] # (1,2) # --- 参数更新 --- W2 - learning_rate * dW2 b2 - learning_rate * db2 W1 - learning_rate * dW1 b1 - learning_rate * db1 # 每1000轮打印一次损失 if epoch % 1000 0: print(fEpoch {epoch}, Loss: {loss:.6f}) # 训练完成后进行预测 print(\n 训练完成最终预测 ) # 使用训练好的参数进行前向传播 Z1_final np.dot(X, W1) b1 A1_final sigmoid(Z1_final) Z2_final np.dot(A1_final, W2) b2 A2_final sigmoid(Z2_final) predictions (A2_final 0.5).astype(int) print(输入数据) print(X) print(\n网络原始输出) print(A2_final) print(\n阈值化后的预测结果0.5为1) print(predictions) print(\n真实标签) print(Y) print(f\n准确率{np.mean(predictions Y) * 100:.2f}%)运行这段代码你会看到损失从最初的约0.7迅速下降最终趋近于0。预测输出也会非常接近[0, 1, 1, 0]。这直观地证明了我们两层感知机的成功。6. 关键问题排查与调优实战在实际动手实现时你几乎一定会遇到一些问题。下面是我在多次教学中总结的常见坑点和解决方案。6.1 网络不收敛损失居高不下这是最常见的问题。可能的原因和解决办法如下学习率不当症状损失值在极高值附近震荡或下降几步后突然爆炸成NaN。诊断学习率太大了。梯度下降步伐过大在山谷两侧来回跳跃甚至飞出了优化区域。解决将学习率调小一个数量级试试比如从0.5调到0.05或0.01。对于这个小网络0.1-0.5通常安全但劣质的初始化可能要求更小的学习率。初始化问题症状损失下降极其缓慢几乎不动。诊断权重初始化值太大或太小。如果太大Sigmoid输入会落在饱和区梯度接近0导致梯度消失如果太小前期信号太弱。解决使用更合理的初始化方法。我们代码中的np.random.randn(...) * 0.1是可行的。也可以尝试Xavier初始化W np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)。梯度计算错误症状损失出现规律性的震荡或朝错误方向上升。诊断这是最棘手的情况几乎肯定是反向传播的公式推导或代码实现有误。解决梯度检查。这是调试神经网络的核心技能。使用数值梯度通过极小的参数扰动计算损失变化来验证你解析计算出的梯度是否正确。如果两者差异很大就回去仔细检查求导和代码。6.2 输出全是0.5左右网络没学到任何东西症状无论输入什么网络输出都稳定在0.5附近。诊断这通常是权重初始化全为0导致的。在对称的初始化和相同的更新下所有隐藏神经元会学到一模一样的东西失去了多样性网络能力退化成类似单层。解决确保权重初始化是随机的、非零的。偏置可以初始化为0。6.3 过拟合在这个问题上不存在对于异或这个仅有4个样本、且是确定性规律的问题我们的目标就是100%准确率地“记住”或“拟合”这4个样本。所以不存在过拟合的概念。模型容量2个隐藏神经元刚好足够学习这个规律。这是教学示例的特殊性。在实际项目中你需要用训练集、验证集来监控过拟合。6.4 参数更新公式中的平均梯度重要技巧在我们的代码中计算梯度dW2,db2,dW1,db1时都除以了X.shape[0]即样本数4。这是为什么 因为我们定义的损失L是四个样本的平均损失。根据求导的线性法则平均损失的梯度等于每个样本损失梯度的平均值。所以我们在累积了四个样本的梯度贡献后需要除以4得到真正的“平均梯度”用于更新。如果忘记除以样本数相当于使用了4倍的学习率很容易导致训练不稳定。这是批量梯度下降中的一个关键细节。7. 从异或问题到现代深度学习的延伸思考通过亲手实现这个两层感知机我们解决的不仅仅是一个具体的逻辑运算问题更是打通了理解现代深度学习基础的关键脉络。第一关于“深度”的必要性。异或问题清晰地证明了即使功能强大的神经元Sigmoid单层排列的能力也是有限的。增加一个隐藏层就赋予了网络进行“特征变换”的能力。现代深度神经网络动辄上百层其核心思想一脉相承每一层都在学习数据的不同抽象层次的表示。底层识别边缘、色彩中层识别部件、纹理高层识别物体、场景。没有多层结构这种逐级抽象是无法实现的。第二关于激活函数的核心作用。如果我们把隐藏层的Sigmoid函数去掉只留下线性变换那么整个网络就退化成输出 (X·W1 b1)·W2 b2 X·(W1·W2) (b1·W2 b2)。这本质上还是一个线性模型X乘以一个新矩阵加上一个新偏置依然无法解决异或问题。正是夹在两层之间的非线性激活函数打破了这种线性组合的桎梏引入了非线性决策边界。无论是Sigmoid、Tanh还是ReLU它们的非线性是神经网络强大表达力的根源。第三关于梯度下降与反向传播的普适性。我们手动推导的梯度更新公式其原理可以毫无障碍地推广到拥有数百万参数、数十层的复杂网络。框架如PyTorch、TensorFlow所做的只是通过自动微分系统将这个过程自动化、高效化。理解了这个底层机制你在使用高级框架时就能更清晰地理解优化器、学习率调度器、梯度裁剪等工具是在做什么而不是把它们当作黑盒魔法。最后我想分享一点个人体会。异或问题就像学习游泳时在浅水区练习蹬腿——动作简单环境安全但练好它你就掌握了前进最本质的动力。每当我在设计更复杂网络遇到瓶颈时回头想想这个简单的两层感知机想想它如何通过空间变换破解难题总能获得最基础的灵感。神经网络不是玄学它的每一步计算都是确定的、可理解的。从这个最小化的案例开始亲手推导亲手编码亲眼看到它从混沌到收敛这种扎实的获得感是任何快餐式教程都无法替代的。希望你在跑通这段代码、看到四个预测值完美跳出的那一刻也能体会到这种纯粹的、解谜般的快乐。

相关新闻

嵌入式Linux设备树详解:从硬件描述到驱动分离的实践指南

嵌入式Linux设备树详解:从硬件描述到驱动分离的实践指南

1. 从“硬编码”到“软描述”:设备树为何而生如果你是从单片机或者早期的嵌入式Linux开发转过来的,第一次接触设备树(Device Tree)这个概念,可能会觉得有点绕。以前写驱动,硬件信息都是直接写在C代码里的&a…

2026/8/5 1:43:48 阅读更多 →
Maya法线编辑全攻略:从原理到实战,解决模型渲染问题

Maya法线编辑全攻略:从原理到实战,解决模型渲染问题

1. 从“模型面片”到“视觉质感”:为什么我们需要编辑法线在三维制作流程里,尤其是游戏和实时渲染领域,我们常常会遇到一个令人困惑的现象:一个模型明明面数不高,结构也简单,但渲染出来却感觉“油腻”、“塑…

2026/8/5 1:43:48 阅读更多 →
深入解析UEFI固件PEI阶段:PPI与HOB机制详解

深入解析UEFI固件PEI阶段:PPI与HOB机制详解

1. 项目概述:从固件冷启动到操作系统握手如果你拆开过电脑主板,或者研究过嵌入式设备的启动流程,大概率会看到BIOS或UEFI这些词。今天我们不聊这些大家伙,而是深入到它们启动过程中最早期、最核心的一个阶段——PEI(Pr…

2026/8/5 1:43:48 阅读更多 →

最新新闻

从零配置 VS Code 高效 Angular 开发环境:插件、调试与实战指南

从零配置 VS Code 高效 Angular 开发环境:插件、调试与实战指南

在实际前端开发中,Angular 是一个功能强大但学习曲线相对陡峭的企业级框架。很多开发者,尤其是从 Vue 或 React 转过来的,初次接触 Angular 时,会被其 CLI、模块化、依赖注入等概念以及复杂的项目结构所困扰。一个高效的开发环境&…

2026/8/5 2:36:10 阅读更多 →
Arduino开发板选型指南:从Uno到ESP32,实战项目驱动硬件选择

Arduino开发板选型指南:从Uno到ESP32,实战项目驱动硬件选择

1. 项目概述:为什么你需要了解不同的Arduino板?如果你刚接触电子制作或嵌入式开发,Arduino大概率是你听到的第一个名字。它就像一个万能工具箱,让编程控制硬件这件事变得像搭积木一样简单。但当你打开购物网站,面对琳琅…

2026/8/5 2:36:10 阅读更多 →
嵌入式控制硬件方案:RK/STM32/ESP32 主控驱动机械臂思路

嵌入式控制硬件方案:RK/STM32/ESP32 主控驱动机械臂思路

嵌入式控制硬件方案:RK/STM32/ESP32 主控驱动机械臂思路机械臂的"脑子"放哪儿,是个有讲究的事。放太弱,算不动;放太贵,量产肉疼。今天就把主流的三套主控方案掰开揉碎了说。一、机械臂控制硬件架构&#xff…

2026/8/5 2:36:10 阅读更多 →
机械臂运动学原理入门:正逆解、D-H 参数、轨迹规划基础

机械臂运动学原理入门:正逆解、D-H 参数、轨迹规划基础

机械臂运动学原理入门:正逆解、D-H 参数、轨迹规划基础运动学听起来吓人,其实就是回答两个问题:关节转了多少度,末端到了哪儿?反过来,末端想去哪儿,关节该转多少度?一、运动学到底是…

2026/8/5 2:36:10 阅读更多 →
生成式与智能体AI认知能力缺陷分类体系

生成式与智能体AI认知能力缺陷分类体系

生成式与智能体AI认知能力缺陷分类体系 论文原文链接:https://arxiv.org/html/2608.02553v1 摘要 认知人工智能(Cognitive AI)旨在突破纯文本生成、单次任务自主执行的局限,构建具备持续推理、自适应行为、长期稳定记忆、自我调控…

2026/8/5 2:36:10 阅读更多 →
AI模型本地部署实战:从环境配置到API集成的完整指南

AI模型本地部署实战:从环境配置到API集成的完整指南

这次我们来看一个名为“豆包 我们没有明天”的项目。从标题和有限的材料来看,这很可能是一个与AI模型本地部署、音视频生成或内容创作相关的工具或整合包。这类项目通常聚焦于降低技术门槛,让用户能在自己的电脑上运行复杂的AI任务,比如文生图…

2026/8/5 2:35:09 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/4 11:09: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/4 13:38:40 阅读更多 →