WDCNN轴承故障诊断实战:原始振动信号深度学习与t-SNE特征验证
简介基于WDCNN的轴承故障诊断资源面向机械设备故障诊断及深度学习方向的研究者、学生与工程技术人员提供一套覆盖数据、代码与可视化结果的完整实验方案该方法采用宽卷积核提取一维振动信号特征在轴承故障分类任务上表现稳定适用于旋转机械状态监测与智能运维场景。资源共13个文件其中10个mat文件对应正常、内圈、外圈、滚动体等不同故障位置及损伤尺寸的振动样本2个Python脚本分别负责数据预处理与模型训练另附1张tsne可视化结果图可直观查看特征空间的聚类效果与类别可分性压缩包仅8.66MB。目前已有1276人学习下载。对初学者可直接运行复现结果对有经验者也可作为更换数据、调整网络结构、扩展对比实验的参考模板是一份实用性较强的入门级资料。1. 基于WDCNN的轴承故障诊断原始振动信号直出类别附t-SNE特征验证如果你做过一段时间旋转机械故障诊断应该体会过这类尴尬时域峰值、频域包络、小波能量谱提了一堆特征最后分类效果还是看缘分。基于WDCNN的轴承故障诊断含tsne可视化这套资源恰好是把疆界往前推了一步——它让深度学习模型直接从原始振动信号里学出故障表征不再依赖手工特征。WDCNN几个字母拆开是“宽卷积核第一层的深度卷积神经网络”用大尺度卷积核先吸收冲击成分再用多层小卷积核细化特征。配套的t-SNE可视化脚本能把网络学到的中间特征压到二维平面让你亲眼看到不同故障在特征空间里怎么分布。新手能按步骤复现熟手也能拿可视化去和传统方法对比。2. 数据准备与预处理切窗、分组、归一化的三处关键取舍2.1 资源里的数据组织方式npz文件与标签如何对齐拿到这套资源后建议先看数据集文件夹的组织方式。常见做法是把不同故障类别的原始振动信号分别存成npz键名里带上类别信息比如class0_signal0、class1_signal0。这样做的好处是标签直接从文件名解析不用额外维护一份csv映射。下面是一个十分常见的目录结构键名前缀对应故障类型典型类别个数class0正常状态1class1内圈故障1class2外圈故障1class3滚动体故障1class4保持架故障1每个键对应的值是一段长度几万到几十万点的原始振动信号。采样率不同信号长度也不同。别急着把整段信号扔进网络传感器采集到的长序列里轴承转速和负载并不是严格恒定直接用整段做输入会让模型去记忆信号长度而不是学习故障模式。我一般会先写一个函数把长信号按固定窗口切成若干等长度样本。窗口长度这个参数不能拍脑袋定它至少要覆盖轴承旋转一圈的采样点数。假设某数据采样率是12800 Hz转频在30 Hz左右那么一圈大约是426个采样点窗口取2048点相当于覆盖约5圈既能包含多次冲击又不至于把转速波动裹进单个样本里。资源里默认窗口长度设成2048这也是故障诊断任务里一个被广泛验证过的尺寸。2.2 窗口切分与集合划分的顺序先按文件分组再切窗这一步是整套复现里最容易埋雷的地方。很多初学做法是先切窗再把所有样本做一次随机train_test_split结果训练集和测试集里混着同一条原始信号的相邻窗口。这类样本在时间上天然相关测试准确率会被严重高估换一段新数据立刻现原形。正确顺序是先按原始信号文件ID划分训练、验证、测试集合再在每个集合内部切窗。这样能保证测试集里的所有窗口来自模型从未见过的原始信号段。下面的代码展示完整流程import numpy as np from sklearn.model_selection import train_test_split # 加载原始长信号 raw np.load(bearing_dataset.npz, allow_pickleFalse) file_list list(raw.files) # [class0_signal0, ...] n_files len(file_list) # 第一层按原始文件划分避免时间相关样本跨集合泄漏 file_idx np.arange(n_files) tr_idx, te_idx train_test_split( file_idx, test_size0.25, random_state3407) tr_idx, va_idx train_test_split( tr_idx, test_size0.20, random_state3407) def slice_by_file(ids, win_len2048, step512): xs, ys [], [] for fid in ids: sig raw[file_list[fid]] label int(file_list[fid].split(_)[0][5:]) # 从classN解析标签 for start in range(0, len(sig) - win_len 1, step): xs.append(sig[start:start win_len]) ys.append(label) return np.stack(xs), np.asarray(ys) X_train, y_train slice_by_file(tr_idx) X_val, y_val slice_by_file(va_idx) X_test, y_test slice_by_file(te_idx)代码逻辑分成三层先随机挑出一部分完整信号文件作为测试集再从剩余文件里抽验证集最后才切窗。对比“先切窗再随机分”的做法这套流程多了一层文件ID维度杜绝了同一段信号的前后窗口同时出现在训练集和测试集的情况。步长step这里取512和窗口2048配合重叠率75%。重叠切窗的目的不是做数据增强骗数量而是让样本之间保持一定连续性让卷积核能观察到冲击所在的完整上下文。如果step过大样本之间丢信息如果step小于256训练集规模膨胀好几倍但很多样本几乎是复制粘贴边际收益很低。2.3 归一化策略全局max比逐样本z-score更稳妥轴承振动信号的归一化经常被当成一个可有可无的步骤实际它直接决定模型能不能学对。有人说“必须z-score”但z-score是按每条样本独立做的把均值减去后再除以标准差等于每条样本的幅值都被拉到了同一个量纲。轴承故障在振动数据上最核心的信息恰恰是冲击幅值差异逐样本标准化会把正常样本和严重故障样本的绝对幅值差异抹掉网络只能靠波形形态区分导致跨负载时准确率明显下降。我一般用全局max归一化也就是找到整个训练集里绝对值最大的数作为分母把所有数据压到[-1, 1]区间。这样既避免了大数淹没小数的梯度问题又保留了不同工况之间的幅值差异。实现如下def normalize_global_max(xs, eps1e-8): 按全局最大绝对值归一化保留跨样本幅值差异。 scale np.max(np.abs(xs)) return xs / (scale eps) X_train normalize_global_max(X_train) X_val normalize_global_max(X_val) X_test normalize_global_max(X_test)注意归一化统计量只用训练集计算验证和测试集沿用同一个scale这是为了模拟真实部署时“新数据进来只能套历史统计量”的情况。如果验证集单独另算scale不同工况下的幅值参照物不一致指标也会失真。真实信号里偶尔有传感器毛刺scale会被个别尖峰顶得很大导致正常样本幅值变得很小。遇到这种情况我一般先对原始信号做一次剪裁把所有超过99.9%分位数的点压到分位数值再去算scale。这种做法比在归一化之后再clip数据要稳得多。3. 搭建WDCNN模型第一层宽卷积核的物理含义与PyTorch实现3.1 为什么第一层非要用64点的大卷积核WDCNN最鲜明的设计特征就是第一层用大卷积核后面四层全部退回3点小卷积核。这套结构和图像识别里的普遍认知相反——图像任务通常前面用大核抽纹理后面用小核细化诊断信号里则是前面大核抗噪后面小核做非线性组合。轴承故障振动信号里故障冲击本身是宽频瞬态成分但采集路径上有大量高频噪声直接用小卷积核去扫原始波形第一层很容易被噪声主导。64点的卷积核覆盖了约三到五个冲击周期卷积过程本身等效于一次低通滤波等于把“先滤波再诊断”这个传统思路并入了网络结构。后面的3点卷积核负责把第一层提炼出的低频特征做进一步组合逐层得到更抽象的故障模式表达。第一层stride这里设成8padding设成24。stride大于1意味着第一层不仅做了卷积还做了大幅度下采样2048个输入点经过第一层后变成255个特征点。如果不做下采样后面四层都在2048长度上运算参数量和计算量会膨胀到不划算。padding取24是为保证卷积核扫到信号两端时不丢掉边缘信息。这个参数不需要你反复试资源里已经按常规配置调好。3.2 网络结构与特征长度变化对照整套模型五层卷积每层接BatchNorm、ReLU和MaxPool。用2048点输入走一遍前向计算各层特征长度变化如下网络层输入长度卷积后长度MaxPool后长度输出通道Conv1 (64/8/pad24)204825512716Conv2 (3/1/pad1)1271276332Conv3 (3/1/pad1)63633164Conv4 (3/1/pad1)31311564Conv5 (3/1/pad1)1515764第五层输出是64×7的特征图经过全局平均池化变成64维向量再接全连接层映射到类别数。全局平均池化的价值在于它把最后的特征图压缩成一个语义向量而不是拉平成几百维的稠密向量这样全连接层的参数量小很多也不容易过拟合。3.3 模型代码五层卷积块加全局平均池化参考资源里的实现基于PyTorch的模型主体如下import torch.nn as nn class WDCNN(nn.Module): WDCNN轴承故障诊断模型宽核首层多层窄核细化。 def __init__(self, num_classes10): super().__init__() self.backbone nn.Sequential( self._make_block(1, 16, 64, 8, 24), self._make_block(16, 32, 3, 1, 1), self._make_block(32, 64, 3, 1, 1), self._make_block(64, 64, 3, 1, 1), self._make_block(64, 64, 3, 1, 1), ) self.gap nn.AdaptiveAvgPool1d(1) self.classifier nn.Linear(64, num_classes) def _make_block(self, cin, cout, k, s, p): return nn.Sequential( nn.Conv1d(cin, cout, kernel_sizek, strides, paddingp), nn.BatchNorm1d(cout), nn.ReLU(inplaceTrue), nn.MaxPool1d(kernel_size2, stride2), ) def forward(self, x): feat self.backbone(x) # (B, 64, T) vec self.gap(feat).squeeze(-1) # (B, 64) out self.classifier(vec) # (B, num_classes) return out代码里_make_block把卷积、批归一化、激活、池化打包成一个固定模式四层后续结构完全一样只是通道数不同。BatchNorm放在卷积和ReLU之间是当前主流的放置顺序能让每一层的输入分布保持稳定训练时收敛速度快不少。MaxPool全部采用kernel2、stride2这是这套资源里一个比较省心的设定。下采样也可以用stride2的卷积来做但那样每个下采样层都会引入额外可学习参数小样本任务里容易过拟合而且翻车以后排查难度更大。MaxPool没有参数作用就是保留局部最强响应把特征图的尺度逐层减半。AdaptiveAvgPool1d(1)这个API在这里是加分项。如果直接用x.reshape(B, -1)输入长度一变全连接层的维度就得跟着改。用自适应池化以后不管输入信号是2048还是4096点最后都能得到64维特征模型的输入长度被解耦了便于后面做迁移实验。4. 训练与调参让损失曲线和测试准确率说明问题4.1 优化器、损失函数与学习率策略的选择训练环节不需要追求花哨技巧关键是让模型稳定收敛。损失函数用交叉熵因为这是标准的多类别分类问题优化器用Adam自适应学习率省去手动调节的麻烦学习率初始值设在1e-3五层小卷积核的配置学习太快容易震荡太慢又让前面的宽卷积核迟迟学不到冲击特征。学习率调度这里用多步衰减每到一个里程碑把学习率减半optimizer torch.optim.Adam( model.parameters(), lr1e-3, weight_decay1e-4) scheduler torch.optim.lr_scheduler.MultiStepLR( optimizer, milestones[100, 150], gamma0.5)参数含义milestones指定在第100轮和第150轮时学习率乘0.5weight_decay是L2正则系数1e-4能略微抑制过拟合特别是当窗口重叠导致训练样本数量虚高时这层约束很有必要。训练200轮是这套资源测试下来的平衡点少于120轮准确率通常还在爬坡多于250轮模型基本收敛再练下去只会增加过拟合风险。如果训练过程中loss上下震荡得厉害优先检查学习率而非网络结构。把初始学习率降到5e-4同时把milestone提前到[60, 90]绝大多数情况都能稳定下来。还有一种我用得更多的替代方案是余弦退火但多步衰减的规律更直观复现时更好判断当前处在哪个阶段。4.2 训练循环每一轮记录验证集最优模型训练时不能只在循环里print loss要把每一轮的训练集和验证集准确率都记录下来并且只在验证集准确率创新高时保存模型权重。这样最后得到的pth文件对应的是泛化能力最好的状态而不是训练最后一轮的瞬时状态。def train_one_epoch(model, loader, optimizer, criterion, device): model.train() total_loss, correct, total 0.0, 0, 0 for x, y in loader: x, y x.to(device), y.to(device) optimizer.zero_grad() logits model(x) loss criterion(logits, y) loss.backward() optimizer.step() total_loss loss.item() * x.size(0) correct (logits.argmax(dim1) y).sum().item() total x.size(0) return total_loss / total, correct / total # 训练主循环保存val表现最佳权重 best_val_acc 0.0 for epoch in range(1, cfg[epochs] 1): train_loss, train_acc train_one_epoch( model, train_loader, optimizer, criterion, device) model.eval() with torch.no_grad(): val_correct, val_total 0, 0 for x, y in val_loader: x, y x.to(device), y.to(device) pred model(x).argmax(dim1) val_correct (pred y).sum().item() val_total y.size(0) val_acc val_correct / val_total if val_acc best_val_acc: best_val_acc val_acc torch.save(model.state_dict(), best_model.pth) scheduler.step()model.train()和model.eval()这两个状态切换很容易被漏掉。train状态下BatchNorm会用当前batch统计量更新均值方差eval状态下用训练阶段累积的全局统计量。如果不切回eval就做验证BatchNorm看到的是验证batch自身的统计量结果会偏乐观误导你保留一个实际不存在的“最佳模型”。保存权重时建议连optimizer和epoch一起存成checkpoint字典。训练过程中突发断电或显存溢出还能从checkpoint恢复继续训练不用从头再来。这在长训练任务里算是给自己留后悔药。4.3 评估指标混淆矩阵比准确率更能说明问题准确率是单一个数值但在多类别诊断场景里准确率一样高不代表模型行为一样。两个模型可能整体准确率都是98%一个把所有正常样本都判对、另一个把外圈早期轻微故障漏判了一半这在实际设备维护里差别巨大。所以花一分钟再输出一张混淆矩阵from sklearn.metrics import confusion_matrix cm confusion_matrix(y_test_all, pred_all) print(cm)横轴是预测类别纵轴是真实类别。对角线数字越大越好最需要警惕的是某个对角线数字压差明显低于其他行说明这个类别被另一个类别系统性“吃掉”了。比如外圈故障样本被大量识别为滚动体故障这说明两类故障的振动特征在卷积核的感受野里存在相似性需要回到数据层面检查采样工况而不是盲目加深网络。资源里给定的评估脚本会一次性输出准确率、每类精确率召回率以及混淆矩阵复现时直接跑完整套流程再结合这些多维指标判断模型报告里的98%到底是不是一个均衡的98%。5. 避坑/常见问题复现时最容易翻车的五处5.1 训练集和测试集准确率都虚高换新数据立刻掉现象训练集准确率99.5%测试集准确率也有99%看起来完美收官但把模型放到另一台设备采集的轴承数据上准确率突然掉到70%上下。原因切窗之后再做随机划分导致同一条原始信号的相邻窗口同时出现在训练集和测试集里。这些窗口在时间上高度相关测试时模型识别的是“这段波动我见过”而不是“这个故障模式我认识”。解决回到2.2节强制先按原始信号文件ID划分集合再切窗。从这之后每次做数据流我都会先检查训练集和测试集里是否存在同源信号如果存在就重新设计划分逻辑。5.2 训练到中期loss突然变成NaN现象前几十轮一切正常某个epoch开始loss输出为nan之后所有指标都变成nan模型彻底废掉。原因最常见的不是网络结构问题而是输入数据里混入了异常大值。某个传感器尖峰在全局归一化时把分母顶得很大导致其他样本幅值被压得极低梯度回传时某些卷积核的权重大幅波动数值溢出。Adam在极端梯度下也会震荡加剧。解决数据加载后先打印np.isnan(x).any()和np.max(np.abs(x))发现异常值就做分位数剪裁。给归一化运算加一个1e-8的epsilon防止除零。另外把初始学习率从1e-3降到5e-4也能给梯度一个缓和区间。5.3 BatchNorm在batch size为1时直接报错现象显存不足把batch size调成1训练循环跑到某个epoch就报错提示每个通道的样本数必须大于1。原因BatchNorm在训练状态下要计算一个batch内多个样本的均值方差batch size为1时方差无定义底层直接拒绝继续计算。这不是模型写错了是BatchNorm本身的统计需求。解决训练阶段保持batch size不小于4资源里的模型推荐batch size是64。如果显存不够优先减少输入信号长度而不是牺牲batch size。推理阶段不受此限制单独跑测试时batch size为1没有问题因为eval状态走的是全局统计量。5.4 t-SNE可视化每次跑出来形状都不一样现象同一份特征数据连续运行两次t-SNE模块两张图的类簇分布差异很大有时候甚至不同类别的位置发生相对翻转。原因t-SNE优化包含随机初始化不同初始点会在低维空间收敛到不同布局。它本质是一种随机优化算法不固定随机种子结果自然每次都不一样。这本身不是错误但拿到论文或报告里很难自圆其说。解决给TSNE固定random_state42并将init参数设为pca。PCA初始化提供一个稳定的起点比随机初始化收敛更快可重复性也大大提高。数据量超过五千条时还要先随机抽样否则优化过程非常慢而且perplexity设定反而失真。5.5 重叠步长过小样本量虚高导致准确率被顶高现象窗口长度2048步长320原本只有几千条原始信号切窗后变成几十万条训练样本测试准确率高得离谱。原因步长太小相邻窗口几乎完全重叠训练样本之间互为复制。模型学到的是相邻窗口的镜像信息而非故障本质验证集里也存在大量同源窗口导致验证指标的参考价值下降。解决把步长控制在窗口长度的1/4到1/2之间资源里默认的512恰好是2048的四分之一。同时做一次同源数据验证用某一台设备的某段数据做测试看看模型是否仍然稳定。保证每个原始信号能生成15到20个训练样本即可不必追求数量上的堆叠。6. 用t-SNE给诊断结果拍一张“特征合影”提取特征、降维与判读6.1 提取倒数第二层特征向量训练完成的模型直接看输出只能看到类别置信度。想理解网络到底怎么区分故障要把backbone输出的64维特征向量抓出来。PyTorch里用forward hook就能干净地拿到中间层输出captured {} def hook_fn(module, input_, output): captured[feat] output.detach().cpu() model.backbone.register_forward_hook(hook_fn) model.eval() feats, labels [], [] with torch.no_grad(): for x, y in test_loader: model(x.to(device)) feats.append(captured[feat].flatten(1)) labels.append(y) feats torch.cat(feats).numpy() labels torch.cat(labels).numpy()hook注册在backbone层上每经过一次前向计算就把backbone的原始输出存一份。这里的输出形状是(batch, 64, 7)flatten成(batch, 448)后就是后续降维的输入。如果只想看全局平均池化后的64维语义向量就把hook移到gap之后两种取法对应不同抽象层次的特征。通常backbone原始输出信息量更足t-SNE图里的类间边界会更清晰。6.2 固定随机种子降维画出二维分布t-SNE这一步总是被当成“玄学”其实参数就那么几个。perplexity设30初期先随机抽取1500个样本太多点会让优化时间成倍拉长太少又塌不出局部结构。代码如下from sklearn.manifold import TSNE import matplotlib.pyplot as plt rng np.random.RandomState(42) sel rng.choice(len(feats), 1500, replaceFalse) emb TSNE( n_components2, perplexity30, initpca, learning_rateauto, random_state42, ).fit_transform(feats[sel]) for cls in np.unique(labels[sel]): mask labels[sel] cls plt.scatter(emb[mask, 0], emb[mask, 1], s5, labelfclass {cls}) plt.legend(markerscale3) plt.axis(off) plt.savefig(tsne_check.png, dpi300)判读t-SNE图时我看三个层面第一同一类别是否聚成紧凑单团第二不同类别之间是否有明显间隔第三有没有某个类别被劈成两片。如果出现第三类情况通常是模型对该故障的某两种子工况学了不同的表征需要回到数据里查负载或转速是否分档过大。从那以后我每条训练任务跑完都会强制生成一张t-SNE图再写结论。没有经过可视化把关的准确率数字在我这里不算数。这个方法也能推广到其他振动诊断模型上换网络只需改一行hook挂载位置。希望这套流程也能帮你在轴承诊断复现路上少走几个弯。本文还有配套的精品资源点击获取

相关新闻

数据库期末考试试题及答案:从背题到造题的复习路径

数据库期末考试试题及答案:从背题到造题的复习路径

简介:这份数据库期末考试试题及答案面向高校计算机及相关专业学生,用于期末复习、自测与考前查漏补缺,也可供教师命题参考。内容围绕数据库系统核心知识展开,涵盖DBMS、数据模型、概念模型与E-R模型、数据独立性、关系数据模型、关…

2026/10/9 14:03:05 阅读更多 →
IDA Pro 反编译 .so 文件实战:从加载到伪代码的完整链路

IDA Pro 反编译 .so 文件实战:从加载到伪代码的完整链路

简介:这份资源面向逆向工程初学者与安全分析人员,聚焦 Android/Linux 平台 .so 动态库的反编译实战,帮助读者借助 IDA Pro 理解二进制反汇编流程与 C/C 代码还原思路。压缩包共约 2000 个文件,整体 156.76MB,以 1769 个…

2026/10/9 14:03:05 阅读更多 →
用Go构建高并发直播间娱乐机器人:从事件流到稳定长连接架构

用Go构建高并发直播间娱乐机器人:从事件流到稳定长连接架构

简介:基于Go语言实现的猫耳FM直播间互动娱乐机器人完整源码方案,面向学习Go高并发编程、直播平台开放接口调用及网络通信协议设计的开发者,也适合有一定基础、希望深入源码阅读的Go学习者。系统覆盖歌曲点播、观众消息处理与弹幕管理等功能&a…

2026/10/9 14:03:05 阅读更多 →

最新新闻

燃料智能化管理系统解决方案:从PPT到落地的数据链路与接口设计

燃料智能化管理系统解决方案:从PPT到落地的数据链路与接口设计

简介:这份PPT方案面向火力发电企业的燃料管理与信息化建设人员,系统梳理了燃料智能化管理的整体解决思路。内容从燃料成本约占火电总成本七成的行业背景切入,阐述自2012年以来各大发电集团推动燃料系统智能化升级的动因,并围绕业务…

2026/10/9 14:56:28 阅读更多 →
X切LNOI波导倍频仿真:COMSOL建模与相位匹配实战

X切LNOI波导倍频仿真:COMSOL建模与相位匹配实战

最近研究X切型绝缘体上铌酸锂薄膜(LNOI)的倍频(SHG)转化效率,COMSOL仿真前前后后跑了一个多月,越跑越觉得这东西比想象中有意思得多。LNOI这两年几乎是集成光子学里的“顶流”平台,几百纳米厚的…

2026/10/9 14:56:28 阅读更多 →
智慧零碳园区解决方案:从66页PPT到落地的四层架构与避坑指南

智慧零碳园区解决方案:从66页PPT到落地的四层架构与避坑指南

简介:这份《智慧零碳园区解决方案》PPT面向园区规划者、能源管理者、智慧城市方案商及政企数字化转型从业者,围绕“有温度、善感知、智生长”的数字生命体理念,系统梳理零碳园区从背景认知到落地运营的完整路径。资源包仅含1个pptx文件&#…

2026/10/9 14:56:28 阅读更多 →
信号完整性补充:从时序预算到实际工程排查

信号完整性补充:从时序预算到实际工程排查

写一篇关于"什么是信号完整性?补充"的技术博文,这事儿说难不难,说简单也不简单。因为在很多硬件工程师眼里,信号完整性(Signal Integrity)已经是个被讲烂了的话题,随便一搜就是一堆解…

2026/10/9 14:56:28 阅读更多 →
Altium Designer 17.0.6安装避坑指南:从环境检查到静默部署的完整方案

Altium Designer 17.0.6安装避坑指南:从环境检查到静默部署的完整方案

简介:Altium Designer 17.0.6安装教程PDF,面向电子设计工程师及PCB初学者,解决Altium Designer软件安装、破解与汉化流程不熟悉的问题。资源包内共1个pdf文件,整体大小3.03MB,内容紧凑,以图文步骤方式组织&…

2026/10/9 14:55:27 阅读更多 →
5G网络切片隔离性验证:从测试设计到pytest自动化落地

5G网络切片隔离性验证:从测试设计到pytest自动化落地

去年做5G行业专网交付的时候,客户在验收会上问了我一个很要命的问题:"你说切片隔离,那我车间里的视频监控流量和AGV控制流量在同一个基站下跑,监控业务能不能把控制业务挤垮?你拿什么证明它不会?"…

2026/10/9 14:55:27 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26: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/9 6:17:20 阅读更多 →