电力-热力-算力三维协同:DQN强化学习实现数据中心节能优化

数据中心这行当,这几年最卷的已经不是单纯的算力堆砌,而是“电费账单”和“散热瓶颈”的双重夹击。我陆续做过几个和智能调度相关的项目,其中“电力-热力-算力三维协同”这套思路,配合DQN(Deep Q-Network)深度强化学习,算是我目前调过最折腾但也最出效果的一个方向。如果你也在做数据中心能耗优化,或者准备把强化学习用到实际工程场景里,这篇东西应该能帮你少走不少弯路。我会把Matlab下的实现思路、建模细节、训练时踩过的坑,以及一套可以直接复用的调参经验,一次讲透。

1. 项目背景与三维协同问题的本质拆解

1.1 数据中心能耗失控的根源在哪

先看一张大家都熟悉的账单结构。一个典型数据中心,信息设备的耗电通常只占50%到60%,剩下的大头全在制冷系统——精密空调、冷冻水机组、风扇这些“维持环境”的设备上。早期大家只管算力,服务器堆得越密,发热密度越高,制冷系统就得开得更猛,于是电力成本像一个无底洞一样往上飙。

这里就出现了一个有意思的耦合关系:算力负载决定了IT设备发多少热,发热量又直接决定了制冷系统的负载,而制冷功耗最终又叠加到总电力约束里。很多人做优化时习惯把这个链条拆开,只调服务器的任务分配,或者只调空调温度设定值,结果往往是按下葫芦浮起瓢——算力上去了,局部热点出来了,空调一降温度,整体电费反而更高。

我们项目中其实一开始也犯了同样的毛病。后来才意识到,IT设备功耗、制冷设备功耗、以及任务调度策略,这三者必须放进同一个优化框架里同时决策,才能真正把数据中心的运营成本压下来。

1.2 电力、热力、算力三个维度各自的门道

三个维度并不是三个独立变量,它们之间是强耦合的,我列一下各自的变量类型:

  • 电力维度:市电电价(分时电价曲线)、可再生能源出力(如果有光伏或储能)、IT设备总功耗、制冷系统功耗、PUE(电能利用效率)。这一维的本质是“钱”,决策目标是总购电成本最低。
  • 热力维度:机房进风温度、出风温度、服务器CPU温度、热点分布、精密空调的制冷量。这一维的本质是“约束”,任何调度策略都必须保证所有设备温度不越限,否则会加速硬件老化甚至宕机。
  • 算力维度:待调度的计算任务队列、虚拟机的资源需求、服务器的可用资源、任务完成时限、算力利用率。这一维的本质是“产出的必要性”,你不能为了省电把所有任务都拒之门外。

三个维度一起做的事其实就一句话:在任务都能按时完成的约束下,通过合理地决定“任务跑在哪台机器上”和“制冷设备怎么配合”,让全网的功耗和电费尽量低,同时不突破温度红线。这件事用数学来描述是一个混合整数非线性规划问题,但实际环境里的信息是逐步暴露的,任务也是随机到达的,传统离线优化很难直接套用。

1.3 为什么传统优化方法搞不定这个题目

团队之前也试过线性规划、遗传算法和启发式规则。它们的核心问题是只能做“静态决策”:算一遍,得到一个固定调度表,然后按表执行。但真实数据中心的负载是分钟级波动的,任务请求随时来,电价每十五分钟可能变一次,如果模型每次都要重新决策一次,计算代价太高;如果不重新算,策略在动态环境下很快就会失效。

另一个痛点是“延迟回报”。你今天把一个计算任务放到某台服务器上,可能要到半小时后才会因为局部过热触发空调加力,从而增加电费。这种“短期决策带来长期影响”的特点,正好是强化学习擅长的场景——它不需要一个全局的静态最优解,而是通过不断与环境交互,学会应对动态变化的长记忆策略。这也是我们最终把方案定为DQN的原因所在。

2. 整体方案设计与DQN建模思路

2.1 三维协同调度问题怎么形式化

任何一个强化学习应用,第一步都是把业务问题翻译成马尔可夫决策过程(MDP)。我们这个场景里的MDP是这样定义的:

状态空间s,主要包括:

  • 当前各台服务器的CPU利用率(归一化向量);
  • 各台服务器的当前温度(归一化向量);
  • 当前任务队列长度和任务总资源需求;
  • 当前时刻的电价系数(分时电价折换成0到1之间的权重);
  • 机房整体温度水平或热点标志位。

动作空间a,这里有个设计取舍:如果动作直接定义为“把哪个任务放到哪台服务器”,动作空间会非常大,而且会随着服务器台数呈指数增长。我们最后把动作拆成了两个阶段决策:

  • 阶段一:任务分配动作,从集合 {任务分配比例方案1, 方案2, ..., 方案N} 里选一个调度策略,比如按CPU温度最低优先、按能效比最高优先、按负载均衡优先;
  • 阶段二:制冷调节动作,从 {制冷强度档位1, 档位2, 档位3} 里选一个档位,配合当前热负荷调整送风温度或风机转速。

这样设计有一个明显好处:动作空间被压缩到几十个离散动作以内,DQN的训练难度会小很多。如果你想把动作设计得更细,比如逐台服务器的开关机决策,那建议优先考虑后续的PPO或DDPG类算法,而不是死磕DQN。

奖励函数r,这句是核心经验:奖励设计一定要把“目标”和“约束”分开写,而且各项数量级要一致,否则训练很容易被某一项带偏。我们用的奖励函数是:

r = -(alpha * p_total / P_base) - (beta * penalty_temp) + (gamma * util_rate) - (delta * sla_violation)

其中:

  • p_total是当前时隙的总功耗(IT加制冷),除以基准功耗P_base做归一化;
  • penalty_temp是所有超温服务器的温度越限量之和,超温越狠,惩罚越大;
  • util_rate是算力利用率,作为正向激励项;
  • sla_violation是任务超时或失败的惩罚计数;
  • alpha、beta、gamma、delta四个权重系数,用来调节不同目标的优先级。

2.2 为什么选择DQN而不是其他强化学习算法

DQN的价值在于它能用深度神经网络来逼近Q值函数,而且通过经验回放(Experience Replay)和目标网络(Target Network)两招解决了传统Q-learning在连续状态空间里不稳定的问题。对我们这种状态维度不算特别高(归一化后大概几十个特征)、动作空间也有限的场景,DQN是一个非常合适的中间选择。

相比之下,如果状态空间爆炸到上百维,可能需要换PPO或SAC这类基于策略梯度的算法;如果动作维度本身是连续的,需要DDPG或TD3。但在这个三维协同调度场景里,DQN的收敛速度和稳定性在同样超参数配置下明显优于Policy Gradient类方法。

还有一点容易被忽略:训练数据的成本。强化学习的每一次交互都要跑一次仿真环境,而我们的仿真里要算热模型、算功耗、算任务排队,速度本身就有瓶颈。DQN的离策略特性允许我们反复使用历史样本,相当于把每一次环境交互的价值榨干,这在训练时间上占了大便宜。

2.3 环境仿真器的搭建要点

做强化学习项目,环境仿真器的可信度决定了最终策略能不能落地上线。我们的仿真环境用Matlab搭了三个模块:

  • 任务模块:按泊松过程生成计算任务,任务包含所需的CPU核数、内存需求和处理时长;
  • 服务器模块:每台服务器定义最大算力、额定功耗、空闲功耗和热容参数,CPU利用率通过一个简化排队模型计算;
  • 制冷模块:用一个简化热阻模型模拟机房温度变化——温度变化率近似等于当前IT设备产热功率减去制冷系统移除的热功率,再除以机房热容。
dT/dt = (P_it - P_cooling_removed) / C_thermal

这个热模型虽然简单,但在训练阶段已经足够帮助智能体学会“算力升高→温度上升→制冷需要加大”的因果链条。如果你追求更精细的效果,可以在获得初步收敛策略之后,再用更精确的热流体仿真数据对模型做校准,没必要一开始就上CFD级别的模拟。

3. Matlab环境下核心模块实现细节

3.1 Matlab做强化学习项目的优劣势

先说结论:Matlab在快速验证和调试方面确实效率高,尤其是数据可视化和矩阵运算这两块。我们最初试过用Python写一套仿真,但做温度曲线分析和策略对比时,Matlab的交互式画图能让你十分钟内看清训练过程中每个状态变量的变化趋势。劣势也很明显——如果训练需要跑几千个episode,纯M文件写DQN会比较慢。

我们的解法是:环境仿真部分全部用Matlab的向量化矩阵运算写,避开循环;DQN训练部分用Deep Learning Toolbox的dlnetwork和trainNetwork接口。这样代码简洁度、可读性、训练速度都能兼顾。

3.2 神经网络结构与参数选择

DQN里面值网络的作用是根据状态输出每个动作的Q值估计。我们用的网络结构是:

参数项取值备注
输入层节点数状态维度(约40)归一化后的状态向量
隐藏层1128神经元,ReLU压缩特征
隐藏层264神经元,ReLU进一步提取
输出层节点数动作空间大小(约24)每个节点对应一个离散动作
优化器Adam默认学习率0.001
损失函数MSE(Q_target与Q_predicted)标准DQN损失

这里有个实操细节:输入向量里的每一维特征必须在同量纲级别,否则网络训练会极其不稳定。我们把所有特征都归一化到[0, 1]区间,包括CPU利用率、温度、队列长度占比、电价系数等。温度不能直接取摄氏度的原值——40度和70度在数值上就差了将近一倍,不利于梯度传播。

3.3 DQN训练主循环的Milestone实现

下面这段代码是我们训练主循环最核心的骨架,我加上了注释说明每一步的作用。核心要点是经验回放和目标网络更新这两个机制必须正确配合:

% ============ DQN核心训练循环 ============ numEpisodes = 2000; maxStepsPerEpisode = 96; % 每回合模拟一天,每15分钟一个时隙,共96步 batchSize = 64; bufferCapacity = 10000; gamma = 0.95; % 折扣因子,数值越大越重视远期回报 epsilon = 1.0; epsilonMin = 0.01; epsilonDecay = 0.995; % 初始化经验缓冲区(用cell数组存储) replayBuffer = cell(0, 5); % 每行: [state, action, reward, nextState, done] % 主循环 for episode = 1:numEpisodes % 重置环境到随机初始状态 env = DataCenterEnv('randomInit', true); state = env.reset(); for step = 1:maxStepsPerEpisode % epsilon-greedy探索/利用 if rand() < epsilon action = randi([1, numActions]); else qValues = predict(qNetwork, state); [~, action] = max(qValues); end [nextState, reward, done, info] = env.step(action); % 存入经验缓冲区 replayBuffer(end+1, :) = {state, action, reward, nextState, done}; if size(replayBuffer, 1) > bufferCapacity replayBuffer(1, :) = []; end % 经验回放训练 if size(replayBuffer, 1) >= batchSize idx = randperm(size(replayBuffer, 1), batchSize); batchState = []; batchAction = []; batchReward = []; batchNextState = []; batchDone = []; for i = 1:batchSize batchState(end+1, :) = replayBuffer{idx(i), 1}; batchAction(end+1, 1) = replayBuffer{idx(i), 2}; batchReward(end+1, 1) = replayBuffer{idx(i), 3}; batchNextState(end+1, :) = replayBuffer{idx(i), 4}; batchDone(end+1, 1) = replayBuffer{idx(i), 5}; end % 计算目标Q值 qNext = predict(targetNetwork, batchNextState); qTarget = batchReward + gamma * max(qNext, [], 2) .* (1 - batchDone); % 当前网络预测Q值(用回放样本计算损失) qPred = predict(qNetwork, batchState); % 构建mask矩阵,只保留对应动作的Q值 actionMask = zeros(batchSize, numActions); for i = 1:batchSize actionMask(i, batchAction(i)) = 1; end qPredMasked = sum(qPred .* actionMask, 2); % 计算梯度并更新主网络 loss = mean((qTarget - qPredMasked).^2); % 调用自动微分更新网络参数... end state = nextState; if done break; end end % 衰减探索率 epsilon = max(epsilon * epsilonDecay, epsilonMin); % 每C步同步目标网络参数 if mod(episode, 10) == 0 targetNetwork = syncNetwork(targetNetwork, qNetwork); end % 记录训练曲线 episodeReward(episode) = sumReward; end

这段代码里有两处最容易被新手改成bug:一是targetNetwork的更新频率不能太快也不能太慢——太频繁等于没有目标网络,太慢会导致目标Q值长期偏离当前策略;二是gamma取值的含义要想清楚。gamma=0.95意味着智能体大约看未来20个时隙的累积回报,如果任务处理的连锁反应时间超过这个范围,效果会打折。

3.4 超参数调优经验表

我整理了一份超参数取值和调整方向速查表,训练时遇到问题可以对照排查:

超参数推荐范围训练曲线异常时的调整策略
学习率0.0001 ~ 0.001损失震荡大就调小,收敛过慢可适当调大
折扣因子gamma0.9 ~ 0.99策略“短视”就调大,发散可以调小
Epsilon初始值0.5 ~ 1.0探索不足就调大,震荡严重可调小
Epsilon衰减率0.99 ~ 0.999高频任务建议衰减慢一点,低频可衰减快
经验池容量5000 ~ 20000训练效果波动大时先优先扩容
Batch Size32 ~ 128样本噪声大时适当调大
目标网络更新周期每5~20回合同步一次不收敛时优先检查这一项

实际调参时一定要一次只改一个参数,同时记录训练曲线,不要同时动三个以上参数。我在项目里就吃过同时调学习率和gamma的亏,连续跑了三个小时,结果完全不知道是哪一项把策略搞崩的。

4. 实验结果分析与常见问题排查实录

4.1 对比实验的基线与指标设计

评估一个有监督算法,你要对比实验;评估一个强化学习策略,你更要对比实验。我们设置了三组基线:

  • 基线A:纯负载均衡策略。任务均匀分配到所有服务器,制冷系统始终工作在中等档位。这是很多数据中心的默认做法。
  • 基线B:温度感知策略。任务始终优先分配到当前温度最低的服务器,制冷系统根据机房平均温度做简单的比例调节。
  • 基线C:固定优先级策略。高优先级任务优先处理,但选择能效比最高的服务器,制冷系统不做动态调节。

实验指标主要包括:总功耗、平均PUE、任务完成率、超温事件次数、总电费(考虑分时电价)。

跑完2000个episode之后,DQN策略的结果和这三组基线对比很明显:

策略平均总功耗(相对值)平均PUE超温事件次数任务完成率
基线A1.00(基准)1.421296.2%
基线B0.931.36597.1%
基线C0.971.40895.8%
DQN策略0.861.31198.4%

DQN在功耗和PUE上确实明显占优,而且超温事件次数被压到了一个非常低的水平。任务完成率还略有提升,说明它并不是靠牺牲任务质量来省电。

4.2 训练过程中我遇到过的四个经典异常

异常一:奖励曲线完全不收敛,一直在-100附近来回震荡。排查了很久发现问题是奖励函数里p_total / P_base这一项的值域远大于其他项,导致智能体完全忽略了温度约束和任务完成率。解决方法是把功耗项的对数量级压缩到0到1区间,并且适当调大温度惩罚项的权重。

异常二:训练到800个episode左右,策略突然退化,所有任务都堆到同一台服务器上。这个问题根因是经验回放池里的样本分布严重偏向某个历史时期的高电价状态,导致Q值估计被扭曲。解决方法是清空经验池重新训练,同时把目标网络的同步周期从10个episode调整到15个。

异常三:收敛速度极慢,跑了1500回合还没有明显下降趋势。检查后发现是动作空间划分太细,某些动作在语义上几乎等价。我做了动作合并后,把相似的制冷档位从5档合并为3档,训练收敛的episode数直接减少了40%。

异常四:测试时策略表现很好,但换了初始条件就失效。这是一个典型的过拟合问题,原因是训练环境里任务到达强度固定在一个值附近。后来给任务到达率加了随机扰动,让智能体在不同负载强度下都见过足够多的样本。

这四个问题基本涵盖了DQN应用在工程场景里最常见的四类坑:奖励失衡、经验池污染、动作设计冗余和训练分布过窄。

4.3 独家快查表:遇到问题先查什么

如果你准备用这套框架做自己的项目,遇到训练不顺利别急着改网络结构,先对照这张表排查:

现象第一优先检查项第二优先检查项
奖励长期不增长奖励函数各项是否同量纲探索率是否衰减过快
Q值发散到极大/极小学习率是否过大目标网络更新是否稳定
策略退化到单一动作经验池是否被污染动作空间是否有冗余项
训练和测试结果差距大训练环境是否过于单一状态特征是否覆盖全
收敛太慢网络层数是否过深Batch Size是否过小

4.4 我在实际调参中养成的几个习惯

几个实战经验想认真分享给你:

首先是奖励函数千万别第一次就设计得太复杂。我见过很多人一开始就往奖励函数塞七个八个指标,结果训练了一个月都不知道哪个指标在主导策略。我现在的习惯是先只放一个核心目标(比如总功耗),训练收敛看到清晰基线之后,再逐步叠加温度约束和任务完成率。

其次是随机性控制。深度学习训练里“固定随机种子”这件事非常影响复现性。我在Matlab里统一用rng(0)初始化所有随机源,包括环境初始状态、任务生成过程、神经网络初始化。这让我每次改动实验配置后,训练曲线的差异都能归因到真实配置变化,而不是运气因素。

最后是状态特征筛选。我们最初尝试把时间戳、日期、星期几这些都加进状态空间,结果网络参数暴增但效果没有提升。之后把所有和能耗决策没有直接因果关系的特征全部去掉,状态维度从60多降到40左右,反而加速了收敛。

还有一个小技巧,就是训练过程中实时画“不同时隙的各个动作Q值热力图”。你会在图上清楚看到智能体刚开始是乱的,中期开始形成规律,后期出现清晰的“高电价时倾向于低制冷档位”的分布模式。看到这种特征逐渐分化,基本可以判断策略开始在学东西了。

最后按照个人经验再啰嗦一句

如果用一句话总结这个项目的核心心得,那就是:数据中心的节能优化,真正的价值不在单个算法的花哨程度,而在于把电力、热力、算力三者锁进同一个环境里,让智能体在一次次的试错中自己找到平衡点。DQN在这里并不是一个最新的算法,但它确实是最适合这个离散动作场景的稳定方案。

我在这个方向上的建议是:如果你搞不定环境仿真,后面再先进的强化学习算法都是空中楼阁。建议先把热模型、功耗模型和任务模型跑得足够可信,再花时间调DQN的参数。环境仿真做得越扎实,训练出来的策略落地时的迁移效果就越好。

后面我打算把单智能体的DQN升级成多智能体版本,让算力调度、制冷调度和新能源电源管理各有一个Agent,再通过合作博弈机制做统一协调。这一步做完,之前积累的Matlab环境仿真框架还可以直接复用,训练目标也会更贴合真实机房的多级管控场景。如果你在做类似方向,欢迎多交流踩过的坑。

相关新闻

Context-Mode 工程实践:跨环节状态传递的分层设计与实现

Context-Mode 工程实践:跨环节状态传递的分层设计与实现

1. 从“上下文模式”说起&#xff1a;一个被低估的工程概念第一次看到“context-mode”这个词&#xff0c;很多人会以为是某个新出的框架或者库。其实不是。它更像是一种设计思路&#xff0c;一种在系统里管理“上下文”这件事的工程模式。你可以在前端状态管理里见到它&#x…

2026/10/20 13:13:05 阅读更多 →
UVa 564 Gaston

UVa 564 Gaston

题目描述 Gaston\texttt{Gaston}Gaston 是一家漫画杂志的员工&#xff0c;他最不喜欢的工作是归档邮件。他设计了一个用棍子和线构成的二叉搜索树系统来存放信件&#xff1a;每根棍子中间挂一封信&#xff0c;左端线下的所有信件编号小于棍子上的信&#xff0c;右端线下的所有信…

2026/10/20 13:13:05 阅读更多 →
MATLAB实现InSAR时序分析:从SLC到毫米级形变图的完整流程

MATLAB实现InSAR时序分析:从SLC到毫米级形变图的完整流程

简介&#xff1a;本资源是一套面向遥感科学与地质工程领域研究者的InSAR时序分析实战教程&#xff0c;聚焦MATLAB平台实现地表形变高精度反演&#xff0c;专为具备SAR基础与MATLAB编程能力的科研人员及工程师设计&#xff0c;助力地质灾害预警、城市沉降监测与冰川变化研究等实…

2026/10/20 13:13:05 阅读更多 →

最新新闻

SecureCRT免安装版配置指南:离线串口调试与SSH便携部署

SecureCRT免安装版配置指南:离线串口调试与SSH便携部署

简介&#xff1a;本资源为SecureCRT绿色便携版免安装包&#xff0c;面向系统管理员、运维工程师及开发人员&#xff0c;解决多平台快速部署安全终端连接工具的需求&#xff0c;尤其适用于需在不同电脑间频繁切换、无管理员权限或追求轻量使用的场景。压缩包共137个文件&#xf…

2026/10/20 14:00:00 阅读更多 →
防火墙规则集时序配置:顺序、生效时间与安全空窗排查

防火墙规则集时序配置:顺序、生效时间与安全空窗排查

防火墙规则集里的时序配置&#xff0c;是我这几年排查安全事件时最常踩的隐形坑。规则明明写对了&#xff0c;但因为顺序放错、时间对象失效、批量下发存在中间态&#xff0c;导致规则的实际生效时间和预期完全对不上&#xff0c;轻则策略空转半个月没人发现&#xff0c;重则直…

2026/10/20 14:00:00 阅读更多 →
Python Pygame核心机制与实战:从零构建接苹果小游戏

Python Pygame核心机制与实战:从零构建接苹果小游戏

很多人在命令行里写过一阵Python脚本之后&#xff0c;总想搞点“能动的、看得见的东西”。Python Pygame模块就是你会碰到的第一块敲门砖&#xff1a;一个基于SDL封装、专门用来做2D图形和游戏的原生库。我第一次用它做窗口程序的时候&#xff0c;印象最深的不是那种“我能控制…

2026/10/20 14:00:00 阅读更多 →
100套可配置ECharts大数据大屏模板工程包

100套可配置ECharts大数据大屏模板工程包

简介&#xff1a;本资源是一套面向数据可视化工程师、前端开发人员及政企数字化项目实施者的专业级大屏模板集合&#xff0c;覆盖社区治理、智慧物业、数字政务、智能交通、金融银行等十余个高需求行业场景&#xff0c;有效解决业务数据实时监控与决策看板快速搭建难题。压缩包…

2026/10/20 14:00:00 阅读更多 →
AI加速剪辑工作流:字幕、粗剪与卡点自动化实战

AI加速剪辑工作流:字幕、粗剪与卡点自动化实战

我见过太多人剪视频&#xff0c;剪到怀疑人生。明明素材拍得挺好&#xff0c;脚本也没什么大问题&#xff0c;但就是一剪一整夜&#xff0c;导出前还在逐帧删吸气声、给字幕换行、把片尾黑场拖到精确位置。你以为是效率问题&#xff0c;其实是你把80%的时间花在了AI 10秒就能搞…

2026/10/20 14:00:00 阅读更多 →
深度学习训练调参实战:梯度、激活函数、学习率与优化器的链路

深度学习训练调参实战:梯度、激活函数、学习率与优化器的链路

入门深度学习时&#xff0c;很多人会被一连串名词劝退&#xff1a;激活函数、优化器、学习率、梯度。我第一次跑模型的时候也觉得它们是四个独立的调参项&#xff0c;今天调一下学习率&#xff0c;明天换一个激活函数&#xff0c;最后模型loss曲线像心电图一样乱跳&#xff0c;…

2026/10/20 13:59:00 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →