深度置信网络DBN回归预测实战:从RBM预训练到微调
接手回归预测需求的时候我手里是一批产线监控数据。特征是温度、压力、转速这类工艺参数目标是一个连续性质量指标。老规矩归一化之后直接上多层感知机MLP结果验证集误差怎么调都下不去加宽加深也没什么改善。后来把模型换成深度置信网络DBN用逐层预训练先学特征、再接输出层做微调一轮跑完误差降了一个明显的台阶。这篇文章就把这次从原理理解到代码落地的完整过程写出来。内容包括DBN的底层机制、数据预处理的关键细节、可直接复现的代码、一次完整回归预测实例的复盘以及我在训练DBN时踩过的坑和实用解法。如果你正打算用DBN做数据回归预测这篇可以直接当操作参考。1. 为什么我在回归预测里绕不开DBN1.1 常规回归方案的瓶颈在哪里表格型数据的回归预测大家用得多的方案无非是几类线性回归、支持向量回归、树模型随机森林、梯度提升树以及多层感知机。每个方案都有自己的短板。线性回归的问题在于表达力不够特征和标签之间的关系一旦复杂起来残差就压不下去而且对特征交互完全无能为力。树模型的好处是不太需要预处理能捕捉非线性和交互关系但它本质上是在做分段近似对连续变化趋势的拟合不够细腻尤其做外推时表现不稳定。MLP在理论上可以逼近任意连续函数但它依赖反向传播更新权重随机初始化导致它很容易陷进局部最优网络层数加深以后梯度消失又会让靠前的层几乎学不到东西。我在这个预测任务上最先用的就是MLP。验证集R2一直卡在0.7附近明显是欠拟合但把网络调宽调深之后没有任何好转反而开始震荡。这种情况在中小规模的表格数据场景里很常见数据量不够大神经网络学不到足够稳定的特征而树模型又缺乏对连续趋势的平滑拟合能力卡在中间相当尴尬。1.2 DBN的两个阶段解决的不是同一件事深度置信网络DBN的处理方式和普通MLP有本质区别。它把训练过程拆成两个阶段第一个阶段是逐层无监督预训练用多个受限玻尔兹曼机RBM依次学习数据的特征表示第二个阶段是监督微调接上一个输出层后对整个网络用反向传播做精修。第一个阶段解决的是初始化问题。MLP从随机权重开始学习随机起点很可能落在糟糕的损失曲面区域。DBN的预训练让每一层网络在接触标签之前就已经学会了数据本身的分布结构这种先验知识给了网络一个更好的起点。第二个阶段解决的是拟合问题在已经合理的特征表示基础上用标签信息把输出调准。这两个阶段的分工意味着即使标签数据有限DBN也能利用特征本身的分布信息把网络初始化得比较好后面微调时只需要在已有基础上做局部修整不会像随机初始化的深层网络那样容易跑偏。1.3 什么场景下DBN最值得用DBN不是万能的。根据我的实践适合用DBN做回归预测的场景大概有三个特征一是数据量在几千到几万这个量级。数据量太小RBM没有足够的分布信息可学数据量太大直接上更复杂的深度模型效率更高。二是特征之间存在交互关系但你不确定具体形式是什么。三是标签是连续值且样本带噪声模型需要一定的鲁棒性。如果数据量极大比如百万级CNN或基于注意力机制的模型优势更明显如果特征绝大多数是离散分类变量树模型往往更好用。DBN最舒服的位置恰恰是数据结构不复杂也不简单、样本不多不少的中间态——这也是大量实际业务数据的真实情况。2. DBN的核心机制从RBM到逐层预训练2.1 RBM是怎么被定义出来的RBM是一个两层的无向图模型一层可见层v对应输入数据一层隐藏层h对应学到的特征。两层之间全连接层内没有连接所以叫受限。RBM通过能量函数定义可见层和隐藏层的联合概率分布E(v,h) -Σ a_i v_i - Σ b_j h_j - ΣΣ v_i W_ij h_j对应的联合分布是 p(v,h) exp(-E(v,h)) / Z其中Z是归一化常数理论上要把所有可能的(v,h)组合都加起来。正是这个Z让直接训练RBM变得困难因为它几乎不可计算。不过我们真正需要的是两个条件概率。给定输入v隐藏层节点的激活概率是p(h_j 1 | v) sigmoid(b_j Σ v_i W_ij)给定隐藏层状态重建可见层的概率是p(v_i 1 | h) sigmoid(a_i Σ h_j W_ij)这两个公式是整个RBM训练的基础。它回答的问题很直观看到一个输入隐藏层节点应该以什么概率点亮反向地看到一组隐藏层特征原始输入最可能长什么样。用生活化的方式来理解RBM像是一个双向翻译器。给定一段话输入它先翻译成一组要点隐藏层特征给定这组要点它能大概还原出原话的意思。训练的目标就是让翻译过去再翻译回来之后的内容尽量和原文一致。2.2 对比散度CD训练算法的本质要训练RBM直接最大化p(v)不可行因为归一化常数Z算不出来。对比散度算法绕开了这个问题。具体做法是对每个训练样本先根据条件概率算出隐藏层激活概率采样出一个隐藏层状态h0然后从这个状态重建出可见层的概率或采样值v_k再从v_k计算出隐藏层激活概率h_k最后用数据的统计量减去重建的统计量来更新参数。更新公式可以写成ΔW lr * ( v_i h_j_data - v_i h_j_recon ) Δa lr * ( v_i_data - v_i_recon ) Δb lr * ( h_j_data - h_j_recon )尖括号表示在批量样本上取均值。这个算法的巧妙之处在于它不需要跑马尔可夫链到收敛通常跑一步CD-1就够用。它给出的梯度方向虽然不是精确的似然梯度但在实践中效果稳定效率也高。CD算法的本质可以这样理解真实数据让隐藏层产生了一种响应模式重建数据让隐藏层产生了另一种响应模式两者的差就是模型还需要往哪个方向调整的指示信号。训练到足够轮次之后模型重建出来的数据会越来越接近真实数据说明隐藏层确实捕捉到了数据的核心规律。2.3 多个RBM堆叠后为什么能提取到更抽象的特征一个RBM只做了一层特征变换表达能力有限。把多个RBM堆叠起来就成了深度置信网络。堆叠过程是这样的第一层RBM把原始输入变成第一层隐藏层特征把第一层隐藏层的激活值当成输入训练第二层RBM得到更抽象的第二层特征继续往上堆每一层都在学习上一层数据的压缩表示。逐层堆叠之所以有效是因为数据特征天然具有层次性。拿预测场景举例原始的工艺参数是温度、压力、转速这类低层物理量经过第一层RBM学到的是温度压力联动的状态这类中层模式经过第二层RBM又进一步抽象为整体工况是否处于某种典型区段这类高层模式。这种层次化的表示比直接从原始特征拟合目标函数要稳定得多。预训练阶段全程无监督不依赖标签。这意味着特征工程的部分工作被转移到了模型内部DBN通过逐层学习自动完成了特征的层次化提取后面微调时只需要在抽象特征和目标之间建立一个映射即可。这也是DBN在小样本回归任务中比随机初始化的深层MLP更稳的原因。2.4 微调阶段如何接上回归输出预训练完成后网络已经拥有了一组较好的特征提取层。这时要做的是把最后一个隐藏层的输出接上一个全连接输出层然后用反向传播对整个网络做一次监督微调。这里有几个关键区别。第一输出层的激活函数在回归任务里必须是线性激活不能再用sigmoid或ReLU否则输出的数值范围会被限制住。第二微调阶段的学习率要比预训练小一般小一个数量级。第三微调并不是说预训练的所有层都要大幅度更新如果数据量不大通常只对最后两层做较大幅度的调整前面层的小幅调整即可。微调阶段做的事情相当于在已经大致知道数据长什么样的特征表示之上学习根据这些特征预测目标值。因为预训练已经提供了良好的起点反向传播只需做局部修整收敛速度和最终精度都明显优于从随机初始化开始训练。3. 数据预处理DBN回归预测里被低估的一步3.1 输入归一化为什么对RBM而言是硬性要求很多人对归一化的理解停留在让训练更快这个层面。但在DBN里归一化不是可选项而是必须要做的事。原因在于RBM的两层都是基于sigmoid激活函数sigmoid在输入绝对值较大的区域会饱和梯度趋近于零。如果某个特征的数值分布在0到1000的区间而另一个特征分布在0到1的区间前者会让对应连接权重的梯度长期处于饱和状态根本学不动。我采用的是标准化也就是减去均值除以标准差让每个特征都在0均值、单位方差附近。这一步在微调阶段同样重要因为反向传播对scale非常敏感输入范围不一致会导致不同特征的权重更新幅度失衡。有一个细节容易被忽略标准化之后如果某个特征的数值范围超出了正负三倍标准差建议检查一下是否有异常点。RBM对异常值的敏感度比较特殊——极端值会主导激活概率导致隐藏层特征被少数异常样本绑架。我对离群点做了截断处理把极端值拉回正负三倍标准差范围预训练质量明显提升。3.2 训练集、验证集、测试集的划分细节回归预测里数据泄漏是最隐蔽的问题。如果特征是按时间顺序采集的随机打乱划分会让模型在训练阶段看到未来的信息验证集指标虚高上线后却立刻失效。正确做法是按时序切分前面的数据做训练和验证最后一段留作测试。实测中这一点直接决定了一个模型能否真正落地。我见过不少项目在离线测试时效果很好上线后误差突然变大查到最后就是数据划分时混入了未来信息。另一个关于验证集划分的细节是训练集、验证集、测试集的分布要保持一致。如果样本来自多个批次且不同批次的工况有明显差异最好按批次分层抽样而不是按行随机抽取。DBN学的特征表示是数据分布的整体反映如果验证集恰好只覆盖了某一个工况区间模型在整个工作范围内的表现就会被高估。3.3 特征初步筛选别让噪声维度拖累预训练DBN虽然能自动提取特征但并不意味着原始特征可以无脑全喂进去。RBM的预训练是无监督的它会把所有输入维度都当作信息来源如果某个维度基本是噪声预训练依然会为它分配权重和计算资源甚至影响隐藏层特征的纯度。我在这次项目中先做了两件事。第一计算每个特征与目标变量的相关性剔除掉相关系数绝对值极低且业务含义不明的维度。第二检查特征之间的多重共线性对高度相关的特征组只保留一个有代表性的比如温度和压力如果几乎同步变化保留其中一个即可。这个步骤不是必须做到极致但一个简单的相关性筛选往往就能带来验证集误差几个百分点的改善。如果特征是纯数值且样本量适中这套相关性初筛 标准化 时序划分的流程基本可以覆盖大部分DBN回归预测场景的需求。4. 从零搭建DBN回归预测模型可直接复现的代码4.1 基于numpy实现RBM类理论讲完直接上代码。这里用numpy从零实现RBM不依赖高级深度学习框架方便看清每一步在做什么也为后面接微调做准备。import numpy as np def sigmoid(x): return 1.0 / (1.0 np.exp(-x)) class RBM: def __init__(self, n_visible, n_hidden, lr0.01): # 权重初始化采用小随机数避免对称性破坏 self.W np.random.normal(0, 0.01, (n_visible, n_hidden)) self.v_bias np.zeros(n_visible) self.h_bias np.zeros(n_hidden) self.lr lr def compute_h_probs(self, v): # 输入v的形状是 (batch_size, n_visible) return sigmoid(v self.W self.h_bias) def sample_h(self, h_probs): return np.random.binomial(1, h_probs) def compute_v_probs(self, h): return sigmoid(h self.W.T self.v_bias) def sample_v(self, v_probs): return np.random.binomial(1, v_probs) def contrastive_divergence(self, batch, k1): # CD-k对批量样本做一次Gibbs采样链 v0 batch p_h0 self.compute_h_probs(v0) # 按概率采样得到隐藏层状态 h0 self.sample_h(p_h0) # 正向重建k步 v_k v0 h_k None for _ in range(k): p_h self.compute_h_probs(v_k) h_k self.sample_h(p_h) p_v self.compute_v_probs(h_k) v_k self.sample_v(p_v) p_h_k self.compute_h_probs(v_k) # 用“数据统计量 - 重建统计量”更新参数 self.W self.lr * (v0.T p_h0 - v_k.T p_h_k) / batch.shape[0] self.v_bias self.lr * (v0 - v_k).mean(axis0) self.h_bias self.lr * (p_h0 - p_h_k).mean(axis0)这段代码里值得注意的地方是预训练阶段的隐藏层状态可以二值采样非二值输入并不需要严格二值化。从实际效果看对标准化后缩放到0到1之间的连续输入直接做CD更新模型也能收敛。后面避坑章节我会专门展开。4.2 逐层预训练的实现逻辑DBN预训练的流程是逐层进行的训练完第一个RBM后把它的隐藏层激活概率作为下一层的输入数据再训练第二个RBM以此类推。class DBNPreTrainer: def __init__(self, layer_sizes, lr0.01): self.rbm_layers [] self.layer_sizes layer_sizes for i in range(len(layer_sizes) - 2): self.rbm_layers.append( RBM(layer_sizes[i], layer_sizes[i 1], lr) ) def transform(self, rbm, data): # 用当前RBM提取特征连续概率值直接作为下一层输入 return rbm.compute_h_probs(data) def pretrain(self, X, epochs80, batch_size64): current_input X.copy() for idx, rbm in enumerate(self.rbm_layers): print(fPretraining RBM layer {idx 1}) n_samples current_input.shape[0] for epoch in range(epochs): permutation np.random.permutation(n_samples) for start in range(0, n_samples, batch_size): batch_idx permutation[start:start batch_size] batch current_input[batch_idx] rbm.contrastive_divergence(batch, k1) # 每10轮打印一次重构误差用于判断是否提前停止 if epoch % 10 0: recon_err self._reconstruction_error(rbm, current_input) print(f Epoch {epoch}, recon error {recon_err:.6f}) current_input self.transform(rbm, current_input) return current_input def _reconstruction_error(self, rbm, data): p_h rbm.compute_h_probs(data) v_recon rbm.compute_v_probs(p_h) return np.mean((data - v_recon) ** 2)预训练过程中最重要的监控指标是重构误差。重构误差持续下降说明RBM在逐步学习数据分布如果连续多个epoch变化很小就没必要继续空跑可以提前进入下一层。有一个经验是预训练的epoch数量并不需要太多通常50到100轮已经足够。微调阶段才是决定最终精度的关键环节。我把预训练时间控制在总训练时间的三分之一以内剩余时间留给微调。4.3 用Keras接上回归输出层做微调预训练得到每层的W和偏置之后要用这些权重初始化一个前馈神经网络再接回归输出层做微调。这一步我用了Keras简洁且不需要手写反向传播。from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam class DBNRegressor: def __init__(self, layer_sizes, pretrained_weights): self.model Sequential() # 第一层初始化预训练权重 self.model.add(Dense( layer_sizes[1], activationsigmoid, input_dimlayer_sizes[0] )) # 中间层逐层添加 for i in range(2, len(layer_sizes) - 1): self.model.add(Dense(layer_sizes[i], activationsigmoid)) # 输出层回归任务用线性激活 self.model.add(Dense(1, activationlinear)) self._set_pretrained_weights(pretrained_weights) def _set_pretrained_weights(self, pretrained_weights): # pretrained_weights是每层RBM的(W, h_bias)列表 for i, (W, h_bias) in enumerate(pretrained_weights): # RBM的W shape是(n_visible, n_hidden) # Keras Dense的W shape也是(n_input, n_units) self.model.layers[i].set_weights([W, h_bias]) def compile_and_fit(self, X_train, y_train, epochs200, batch_size32, lr0.001): self.model.compile( optimizerAdam(learning_ratelr), lossmse ) self.model.fit( X_train, y_train, epochsepochs, batch_sizebatch_size, validation_split0.1, verbose1 ) # 使用示例 pretrained [(rbm.W, rbm.h_bias) for rbm in trainer.rbm_layers] regressor DBNRegressor(layer_sizes[12, 64, 32, 1], pretrained_weightspretrained) regressor.compile_and_fit(X_train_scaled, y_train_scaled, epochs200)这里有一个容易搞错的方向问题RBM的权重矩阵W形状是(n_visible, n_hidden)Keras的Dense层权重形状也是(n_input_dim, n_units)两者正好对应直接set_weights就可以。前提是预训练阶段RBM隐藏层激活函数和微调阶段Dense层的激活函数都是sigmoid否则权重含义会不匹配。4.4 训练配置的关键参数把这次项目中实际使用的训练配置整理成表方便直接参考参数预训练阶段微调阶段优化器CD-1对比散度Adam学习率0.010.001批次大小6432训练轮数80200网络结构[12, 64, 32][12, 64, 32, 1]激活函数sigmoid隐藏层sigmoid输出层linear微调阶段用了早停机制监测验证集损失连续20轮没有下降就停止。这一步对防止过拟合很有效尤其在小样本场景下盲目跑满固定epoch数往往会在后期把验证集误差重新拉上去。5. 一次完整的回归预测实例复盘5.1 数据背景与评价指标这次项目的数据来自某生产环节的工艺记录12个连续型特征包括反应温度、压力、进料速度、搅拌转速等目标是预测成品的一项强度指标。共1500条样本按时间顺序划分前1050条用于训练中间225条用于验证最后225条作为测试集。评价指标用了三个决定系数R2反映整体拟合程度RMSE反映误差的绝对值水平MAE反映误差的稳健水平。R2越接近1越好RMSE和MAE越小越好。数据预处理的完整流程是初筛掉两个基本和目标无关的维度剩余10个特征做标准化目标值也做了标准化预测完成后反标准化回原始量纲。标准化目标值这一步在回归预测中非常重要因为它让微调阶段的MSE损失落在可比较的量纲上训练更稳定。5.2 训练过程中的曲线观察预训练阶段每一层RBM的重构误差都呈现先快速下降后趋平的趋势。第一层从初始的约0.35下降到0.12左右第二层从0.28下降到0.10左右。这个下降过程说明隐藏层确实在逐步捕捉输入特征的主要变化模式。微调阶段更值得观察。因为预训练已经给了很好的起点训练集损失从第一个epoch开始就明显低于同结构随机初始化的MLP整个训练周期的水平。验证集损失在前50轮快速下降之后趋缓早停机制在第172轮触发。这里有一个有趣的现象相同网络结构下随机初始化的MLP在验证集上的表现波动比较大不同随机种子跑出来的结果差异明显而DBN因为有了预训练权重多次重复实验的结果几乎一致稳定性好很多。可复现性对于实际工程项目来说价值甚至高于几个百分点的精度提升。5.3 与MLP基准的对比结果用同一份划分后的数据跑了两个基线模型一个是相同深度的随机初始化MLP另一个是直接跳过预训练、只做监督学习的MLP。对比结果如下模型R2RMSEMAE随机初始化MLP同结构0.734.523.41无预训练MLP监督微调0.784.103.05DBN预训练微调0.863.182.42对比里最有说服力的不是最终精度而是预训练带来的增益。同样的网络结构、同样的微调流程仅仅因为把随机初始化换成了RBM逐层预训练得到的初始化R2就从0.78提到了0.86RMSE下降了接近一个单位。这个结论和理论预期是一致的中小规模数据上深层网络的瓶颈往往不是表达能力而是优化问题。DBN通过预训练改善了优化路径让深层结构的潜力真正发挥出来了。6. 训练DBN时踩过的坑和解决思路6.1 连续输入直接喂给标准RBM的争议很多资料会说标准RBM是处理二值数据的连续输入要先二值化否则模型无法训练。我在实践中发现这个说法需要分情况看待。严格来说标准伯努利RBM的采样公式确实围绕二值变量构建。但在CD算法的实际计算中我们使用的是隐藏层激活概率来做期望估计而不是必须对输入做二值采样。把标准化后缩放到0到1区间的连续值直接作为可见层输入同样能驱动权重更新模型也能学到有效的特征表示。真正需要避免的是两件事一是输入范围过大导致sigmoid饱和二是重构阶段对连续值强行做二值采样导致信息严重损失。我在RBM类的实现里没有对输入做二值化重建时直接使用概率值。课程里说的理论严格性和工程可用的做法在这里产生了微妙差别实践者要懂得取舍。如果你追求更严格的建模可以考虑高斯可见层的RBM变体但在绝大多数回归预测任务中这种直接处理连续输入的方式已经足够稳定。6.2 预训练和微调用同一套学习率的坑这是我在第一次跑DBN时踩过的大坑。当时抱着省事的心态预训练和微调都用了0.01的学习率结果微调阶段损失值在前几轮剧烈震荡之后验证集精度反而不如不微调。原因分析下来很清晰预训练得到的权重已经是相对合理的特征提取器微调阶段如果学习率太大反向传播的梯度更新会迅速破坏前面层已经学到的特征结构。这就像在一幅已经画好的素描上直接用粗刷子上色几下就把轮廓冲没了。正确的做法是给预训练和微调分别设置学习率微调的学习率至少比预训练小一个数量级。如果数据量很小可以考虑只对最后两层用较大学习率前面层冻结或用更小的学习率。学习率衰减策略也值得加微调后期降到初始值的十分之一精度还能再提升一点。6.3 隐藏层大小和深度的选择经验DBN的隐藏层大小和深度没有标准公式但有几个经验法则可以分享。隐藏层节点数太小时特征提取能力不足预训练重构误差会卡在比较高的水平节点数太多时模型复杂度上升在中小样本下容易过拟合。我常用的参考区间是第一层取输入维度的2到4倍后面每层依次减半或保持相近。深度方面两层隐藏层对于大多数表格型回归预测任务已经足够三层可尝试但收益通常不大。不要被深度二字吓住DBN的价值在于预训练机制而不是盲目堆层数。我在这次项目里用的[12, 64, 32, 1]结构两层隐藏层效果已经令人满意。判断隐藏层大小是否合适有一个实操方法观察预训练的重构误差。如果重构误差降到低位且平稳说明该层容量适合当前数据复杂度如果重构误差表现不佳调整这一层的节点数比无脑调整学习率更有效。6.4 防止过拟合的几个实用手段DBN在小样本回归预测中也会过拟合表现是训练集损失持续下降但验证集损失上升。我实际采用的方案有三个。第一个是微调阶段的早停机制监测验证集损失连续多轮不下降就停止训练能在不过度消耗计算资源的情况下找到最优轮数。第二个是权重衰减微调阶段给隐藏层的Dense层加一个小的L2正则数值通常在0.0001到0.001之间即可产生明显效果。第三个是Dropout在微调阶段的隐藏层之间插入Dropout层丢弃率从0.2开始调。有一个容易被忽略的细节Dropout和Dropout在预训练阶段不要加加了会干扰RBM学习数据分布的能力。预训练阶段的鲁棒性依赖于对完整数据的统计建模正则化手段只在监督微调阶段使用。关于DBN的另一个常见问题是训练速度。预训练阶段因为要逐层跑多轮CD耗时相对较长。如果数据量大建议对每个RBM做小批量采样批次大小从64到128不等不要直接在整个数据集上做全量梯度更新。最后再分享一个小技巧预训练阶段每层的重构误差是很有价值的诊断指标。如果某一层的重构误差下不去往往说明这一层节点数不够或者输入特征中噪声维度太多。先调这一层的结构比盲目调整网络深度高效得多。这个小习惯让我后来做DBN相关任务时少走了很多弯路。

相关新闻

Python字典有序遍历全解析

Python字典有序遍历全解析

有序遍历dict(字典)大家都知道, 字典这个东西本身是无序的。这篇文稿主要是来给大家解释一下, 关于字典有序遍历这一块的内容。在这里面呢, 我们其实主要用到了一个方法, 就是括号里面写的那个。一、在这里呢, 是有关这种方法的具体介绍。内建方法里面的这个排序的功能, 它是可…

2026/10/18 22:33:43 阅读更多 →
多模态虚假新闻检测:图文一致性建模与可解释性实践

多模态虚假新闻检测:图文一致性建模与可解释性实践

简介:本资源是一套面向高校学生与初学者的虚假新闻检测多模态识别完整实践项目,聚焦Python生态下的文本与轻量级特征融合建模,适用于毕业设计、期末大作业及课程设计等高分场景。项目代码结构清晰,含16个核心Python脚本&#xff0…

2026/10/18 22:33:43 阅读更多 →
力扣70爬楼梯

力扣70爬楼梯

70. 爬楼梯 - 力扣(LeetCode) 和打家劫舍一样的思路 1.看如何到最后一步的 ①跨一级台阶到 ②跨两级台阶到 则:f(x) f(x-1) f(x-2) f(x)是爬到x阶的方案数量 2.考虑边界 台阶有0、1阶时只有一种方案; f(2&a…

2026/10/18 22:33:43 阅读更多 →

最新新闻

openclaw/workbuddy机器人绑定通道后只能默认自己使用问题解决:把settings改到TaoToken

openclaw/workbuddy机器人绑定通道后只能默认自己使用问题解决:把settings改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 23:27:29 阅读更多 →
Elastic AI agent skills 实战:把 Claude Code 的 endpoint 改到 TaoToken

Elastic AI agent skills 实战:把 Claude Code 的 endpoint 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 23:27:29 阅读更多 →
开源年会十年口碑背后:技术活动策划与开发者社区运营实战拆解

开源年会十年口碑背后:技术活动策划与开发者社区运营实战拆解

COSCon 这个牌子能在第十年登上主流媒体版面,还被技术社区评为“最受开发者欢迎的技术活动”,说实在的,作为从第一届就开始参与的老志愿者,我的第一反应不是兴奋,而是感慨。开源年会这种形态,在技术圈里一直…

2026/10/18 23:27:29 阅读更多 →
嵌入式C语言实现10种常用滤波算法:从原理到代码移植

嵌入式C语言实现10种常用滤波算法:从原理到代码移植

简介:这份资源面向嵌入式开发、单片机应用及信号采集方向的工程师与学生,系统整理了10种常用软件滤波算法的C语言实现,帮助解决传感器采样中随机干扰、周期性波动与脉冲噪声等实际问题。压缩包共3个文件,包含1个C源码文件、1个Wor…

2026/10/18 23:27:29 阅读更多 →
10种常用滤波算法C代码实现:从限幅到卡尔曼的选型指南

10种常用滤波算法C代码实现:从限幅到卡尔曼的选型指南

简介:这是一份面向嵌入式开发、单片机应用及信号采集方向的滤波算法实践资料,围绕C语言实现展开,适合需要处理传感器数据、抑制随机干扰的工程师与学生参考。资源系统整理了限幅、中位值、算术平均、递推平均、中位值平均、限幅平均、一阶滞后…

2026/10/18 23:27:29 阅读更多 →
微信小程序AI聊天源码:流式输出与LLM对接实战

微信小程序AI聊天源码:流式输出与LLM对接实战

简介:这份资源是一套微信小程序AI聊天页面的完整前端源码,面向希望快速上手小程序对接大语言模型的开发者与学习者,尤其适合想体验AI对话能力、验证人设设定效果的入门到中级人员。压缩包共6个文件,约386KB,包含wxml页…

2026/10/18 23:26:29 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →