一维卷积神经网络(1D-CNN)结构设计、参数计算与部署实战
发布时间:2026/11/5 6:24:21 锦皓数字建站
结构设计、参数计算与部署实战`)
做设备状态监测那几年我接过一个挺典型的活儿一台旋转机械上贴了三轴加速度计采样率 25.6 kHz要求从振动信号里判断轴承有没有早期损伤。团队一开始走的是傅里叶变换加人工特征那条老路——算峭度、算包络谱峰值、算各频带能量占比然后再喂给支持向量机。效果不能说不行但换一个工况、换一批设备阈值就得重调一遍维护成本高得离谱。后来我们把这条链路换成了一维卷积神经网络1D-CNN让网络自己去从原始波形里学局部模式人工特征从二十几个缩到只剩哪个通道窗长多少这两个超参跨工况的召回率反而稳了不少。一维卷积神经网络1D-CNN说白了就是卷积核只在一个方向上滑动的卷积网络。二维卷积核在图像上沿着高、宽两个方向滑一维卷积核沿着时间轴或者序列轴单向滑每次只看一个长度为 k 的局部窗口。它解决的问题很聚焦从一维序列里提取局部模式并且把这些模式逐层组合成更大的结构。它能干的活儿远不止振动信号——心电、脑电、肌电、语音、机械振动、电流波形、传感器时序、文本词序列、基因序列、光谱曲线凡是沿着一个方向有先后顺序的数据都是它的主场。这篇东西适合两类人看一类是手里已经有一堆一维数据、想上深度学习但不知道从哪儿下手的朋友另一类是用过 CNN 处理图片转头做时序信号时发现好像哪里都不对的朋友。我会把设计思路、参数怎么算、代码怎么搭、坑在哪儿尽量说透能抄的部分直接抄。1. 先想清楚 1D-CNN 到底在处理什么1.1 一维卷积的物理直觉一个会滑动的模式匹配器很多人第一次接触卷积脑子里全是公式。我建议先建立一个物理图像把卷积核想象成一把带刻度的尺子尺子上有 k 个刻度值这些值一开始是随机的。这把尺子从信号最左端开始每次往右挪 s 个点每挪一次就把尺子上的刻度和它盖住的那段信号做一次加权求和得到一个数。挪完一遍一条长度为 L 的信号就变成了一条长度为 L/s 左右的新序列。这个动作的本质是局部模式匹配。如果尺子上的刻度长成上-下-上那它就是在找信号里先升后降再升的形状。训练的过程就是让这些尺子自己长成最有区分度的形状。在振动信号里尺子可能长成一个衰减振荡的冲击形状在心电里尺子可能长成 QRS 波群的陡峭上升沿在电流波形里尺子可能长成设备启动瞬间的那种驼峰。这也是 1D-CNN 相比全连接网络最核心的优势所在参数共享和局部连接。一个长度 2048 的输入接全连接到 256 维隐层参数量是 52 万同样长度接一层 k15、32 通道的一维卷积参数量只有 480。差了三个数量级而且卷积还自带平移不变的归纳偏置——同一个冲击出现在窗口的前段还是后段卷积都能认出来全连接网络得为每个位置分别学一遍。我在实际项目里最直观的感受是小样本场景下1D-CNN 几乎是唯一能跑通的选择。几百条标注样本全连接网络必然过拟合到妈都不认识卷积网络靠参数共享能把泛化撑住。1.2 和 2D-CNN、循环网络、Transformer 的分工边界选型这件事我踩过的坑比写过的代码多。说几个明确的分界方案适合的数据形态优势什么情况下别用1D-CNN单/多通道等长序列参数少、训练快、局部模式敏感长程依赖是主要矛盾时2D-CNN频谱图、时频图、多传感器矩阵能同时抓时频结构数据量少时容易过拟合RNN/LSTM/GRU变长序列、强时序依赖天然处理顺序长序列训练慢、梯度问题Transformer长序列、多变量、需全局注意力长程建模强小数据上训练极不稳定有个判断标准我一直在用如果你的判别信息集中在几十到几百个采样点构成的局部形状里1D-CNN 就是最合适的如果信息要靠窗口开头和窗口结尾的关系才能判出来那才需要考虑注意力机制或者循环结构。举个具体例子。轴承故障诊断里早期损伤的判别依据是周期性冲击 结构共振调制冲击本身的形态只有几个毫秒特征是局部的1D-CNN 完美对口。但如果任务是判断一段十分钟的操作序列里操作员有没有违规步骤关键信息是相隔几分钟的两个动作之间的因果关系这时候硬上 1D-CNN 就得把感受野堆到几千点效果还不如直接上 Transformer。还有一个常见误区为了追新在几百条样本的数据集上直接上 Transformer。我见过一个跨平台系统项目样本量不到八百条硬套多头的注意力结构训练损失降到 0.01验证集准确率在 50% 上下打转本质上就是模型把训练集背下来了。后来换成四层的小型 1D-CNN参数量从 200 万降到 16 万验证集直接上到 88%。选型不是选先进的是选匹配的。1.3 什么样的任务适合上 1D-CNN一份自查清单我把这些年判断要不要上 1D-CNN的经验整理成几条你可以对照着自己的任务打分数据是沿着单一方向排列的序列采样点之间有物理意义上的先后顺序判别依据是局部形状冲击、波形突变、峰谷组合、字符片段而非全局统计量各样本长度基本一致或者可以规整到一致存在一定量的标注数据几十条也能试但几百到几千条最舒服对推理延迟有要求需要模型能在有限的算力预算内跑完通道之间存在一定相关性但不像图像那样有严格的空间邻接结构。反过来说如果你的数据是三轴加速度计 温度 电流共十几个通道而且通道之间的物理位置关系很重要那也可以先试试把通道当成特征维塞进 1D-CNN 的输入通道只要把in_channels设对就行。我做过一个五通道的电机故障项目把三相电流 振动 温度拼成一个 5×2048 的输入1D-CNN 直接吃下去效果比逐通道单独建模再投票好 6 个点原因就是通道之间的耦合信息被网络自己学出来了。注意把多通道塞进 1D-CNN前提是各通道已经严格时间对齐。如果传感器之间存在采样时钟偏差网络学到的会是错位的伪模式精度反而下降。上多通道之前务必先做一次互相关对齐检查。2. 网络结构设计与参数计算2.1 输出尺寸与感受野两个必须手算的量搭网络之前有两个量我一定会拿笔算一遍每层的输出长度和每层的感受野。不算这两个你根本不知道自己搭出来的网络到底看得到多宽的世界。输出长度的公式L_out floor((L_in 2p - d*(k-1) - 1) / s) 1其中 k 是卷积核长度p 是单侧 paddings 是步长d 是空洞率普通卷积 d1。感受野的递推公式RF_i RF_{i-1} (k_i - 1) * d_i * prod(s_1 ... s_{i-1})拿我常用的那个配置举例输入长度 2048单通道四层卷积全部用padding k//2保证 k 为奇数时输出长度只由步长决定。层卷积核 k步长 s输出长度感受野点参数量输入--20481-conv1152102415480conv21125123522528conv3722565957344conv4521289181920算第一节(2048 14 - 14 - 1) / 2 1取整后是 1024。第二节(1024 10 - 10 - 1)/2 1 512。感受野逐层是 15、35、59、91。总参数量约 16.2 万其中绝大部分在最后两层这是个很轻的模型单核 CPU 上推理一条 2048 点的样本不到 1 毫秒。关键在于感受野的物理含义。采样率 25.6 kHz相邻采样点间隔约 39 微秒91 个点对应约 3.55 毫秒。如果目标故障的特征频率在 300 Hz 左右周期 3.3 毫秒那 91 点的感受野刚刚好覆盖一个完整周期能捕捉到冲击的完整形态。但如果你要判别的现象周期是 20 毫秒50 Hz91 点就只覆盖了五分之一周期网络看不全精度必然上不去。我第一次做这个项目时就吃了这个亏。照搬了图像领域的小卷积核堆深思路全用 k3堆了八层感受野算下来才 20 多个点模型在验证集上死活卡在 70% 出头。后来把首层卷积核放大到 31后面几层维持中等核感受野拉到 150 点以上同一个数据集精度直接跳到 91%。首层大核 后续中小核这个配置在振动、心电、语音这几类信号上我都验证过普遍比全小核堆深更划算因为大核在低层就能覆盖足够宽的原始波形还省了层数带来的显存和延迟开销。2.2 通道数怎么定从 32 起步别一上来就 256通道数也就是滤波器个数决定了每一层能学到多少种不同的局部模式。这个参数没有理论最优解但有很强的经验规律。我的默认配置是首层 32之后每下采样一次翻一倍到 128 或 256 封顶。上面那个表就是 32→64→128→128 的走法。理由很直白浅层需要学的模式类型少边缘、上升沿、冲击深层需要学的组合模式多通道数递增符合特征抽象层级的直觉。我见过不少新手直接把首层设成 256参数量瞬间涨到 3856看着还好但后面每层都 256五层下来参数量近百万几百条样本的数据集根本撑不住。更要命的是训练时间同样的 epoch 数跑一晚上和跑一小时的区别。有个折中方案如果显存和延迟允许可以试试在同一层里用多尺度的并联卷积核也就是把 k3、k7、k15 三条支路并行算完再拼接。这个结构在振动信号上效果好得有点出乎意料因为不同故障类型的特征时间尺度本来就不一样——滚动体故障的冲击很窄外圈故障的冲击更宽多尺度并联等于让网络自己选尺子。代价是参数量增加 1.5 倍左右需要权衡。还有一个容易被忽略的点通道之间的冗余。训完之后我会习惯性地算一下各通道输出的相关系数矩阵如果发现某些通道的输出几乎完全相关相关系数 0.98 以上那说明通道数给多了可以砍掉一部分再微调。在嵌入式部署场景下砍掉 30% 的通道通常只掉 0.5 个点精度但推理时间能省 20% 以上。2.3 池化、下采样与全局池化怎么让维度乖乖收敛让 2048 维的输入最后变成一个分类概率中间必须做降维。降维手段有三种我用下来各有取舍。步长卷积是我现在的主力。把 stride 设成 2卷积的同时就把长度减半不需要单独的池化层参数利用率更高而且梯度回传路径更短。上面那个四层网络全部用 s2长度从 2048 一路降到 128非常干净。最大池化的优点是抗噪取局部最大值相当于只要这个窗口里出现过冲击就保留对振动信号的稀疏冲击特别友好。缺点是丢了位置信息而且反向传播只对最大值位置有梯度训练时收敛会慢一点。我一般只在信号噪声特别大、信噪比低于 0 dB 的场景下才用它。平均池化我基本不用在中间层因为它会把冲击抹平恰好抹掉了最有判别力的信息。但在最后做全局池化AdaptiveAvgPool1d(1)时它又非常好用——把 128 个时间位置平均成一个向量天然实现了变长输入到定长输出的转换。提示如果你需要模型支持变长输入比如有的样本 1500 点有的 3000 点最后一定用自适应全局池化别用固定尺寸的 Flatten。我早期一个项目就是写死了 Flatten上线后遇到短样本直接崩改了两行代码才解决。顺带说一句降维过快的问题。如果四层全部用 s2长度会降到原来的十六分之一如果原始窗长只有 512 点最后只剩 32 个位置再往下就没法做了。这种短窗场景我一般把前两层步长设 1后两层设 2保证最后至少留 64 个时间位置给全局池化。2.4 归一化、激活与残差那些让训练不崩的细节结构搭好只是第一步真正决定能不能训起来的是这些配料。BatchNorm1d基本是标配。一维信号的幅值波动极大同一个传感器在不同工况下信号均值能差出几倍不做归一化的话第一层卷积的梯度尺度会剧烈波动。BatchNorm 放在卷积之后、激活之前我测下来比放在激活之后的收敛速度快 30% 左右。要注意的是推理时必须切到eval()模式用训练期累积的滑动统计量否则单条样本的 batch 统计量会把结果带偏。激活函数方面ReLU 是最稳的默认选项便宜、不容易饱和。但有个细节如果信号里有大量负向冲击比如某些传感器的下降沿特征更明显ReLU 会把负半轴全部截断丢掉一半信息。这种情况我会换成 LeakyReLU负斜率 0.01或者 ELU。我做过一组对比在心电信号上LeakyReLU 比 ReLU 平均高 1.2 个点代价几乎为零。残差连接在层数超过六层之后就该考虑加上。1D-CNN 的梯度消失问题虽然比 RNN 轻但深到十几层时照样会退化。加一个x x block(x)的旁路训练稳定性提升非常明显。不过要注意通道数变化的时候旁路得用 1×1 卷积做投影别直接相加。Dropout的位置很讲究。放在卷积层之间效果一般甚至有害因为卷积特征有很强的空间相关性随机丢弃会破坏局部结构。我一般只放在最后的全连接头前面比例 0.2 到 0.4。另一种更有效的正则化是权重衰减AdamW 配 1e-2 到 5e-2 的 weight_decay在小样本数据集上的效果比 Dropout 好。3. 从零搭一个能跑的 1D-CNN3.1 数据预处理滑窗、归一化与标签对齐这一段是整个流程里最容易出错、也最影响最终精度的地方比网络结构重要得多。滑窗切分是第一步。原始信号是一条长记录需要切成固定长度的样本。我用得最多的参数是窗长 2048、重叠 75%也就是 hop512。窗长怎么定一个经验法则窗长至少覆盖目标现象的 3 到 5 个完整周期。如果目标特征频率是 100 Hz采样率 25.6 kHz一个周期 256 点那窗长取 1024 到 1280 比较合适。import numpy as np def sliding_window(sig, win2048, hop512): 把一维信号切成重叠窗口返回 shape(n, win) n (len(sig) - win) // hop 1 idx np.arange(win)[None, :] hop * np.arange(n)[:, None] return sig[idx]这里有个必须强调的坑重叠滑窗会让同一条原始记录切出的样本之间高度相关。如果你按样本随机划分训练集和验证集同一段信号的前半截在训练集、后半截在验证集模型等于提前见过答案验证精度会虚高十几个点上线后一塌糊涂。正确的做法是按整段记录划分或者按设备编号、按采集批次划分。我现在的习惯是先做分组划分再在组内做滑窗。这个改动听起来事小实测能把实验室 99%、现场 62%这种尴尬差距缩小一大半。归一化同样要小心。必须用训练集的均值方差不能各样本自己归一化。有些朋友喜欢对每条样本单独做 z-score这等于把幅值信息完全抹掉了——而幅值在故障诊断里恰恰是重要特征损伤越严重冲击幅值越大。我的做法是用训练集全局的均值和标准差做标准化保留相对幅值差异。mu, sigma train_sig.mean(), train_sig.std() 1e-8 x_train (x_train - mu) / sigma x_val (x_val - mu) / sigma # 用训练集的统计量标签对齐是另一个高频错误点。滑窗之后每个窗口的标签要对应窗口中心位置所在的时间段而不是窗口起点。如果窗口很长、标签变化频繁起点对齐会导致系统性偏移。我在一个多阶段工艺识别的项目里就吃过这个亏窗口 4096 点、hop 1024用起点对齐结果所有阶段边界都提前了半秒混淆矩阵上看就是相邻类别互相混淆。改成中心对齐后立刻正常。3.2 PyTorch 实现骨架与参数注释下面这个结构是我用得最顺手的一个基线四层卷积 全局池化 单层分类头参数量 16 万左右适合几千条以内的数据集。import torch import torch.nn as nn class Tiny1DCNN(nn.Module): def __init__(self, in_ch1, n_classes4, width32, p_drop0.3): super().__init__() def block(cin, cout, k, s): return nn.Sequential( nn.Conv1d(cin, cout, kernel_sizek, strides, paddingk // 2, biasFalse), nn.BatchNorm1d(cout), nn.LeakyReLU(0.01, inplaceTrue), ) self.features nn.Sequential( block(in_ch, width, 31, 2), # 2048 - 1024, RF31 block(width, width * 2, 15, 2), # 1024 - 512, RF61 block(width * 2, width * 4, 11, 2), # 512 - 256, RF101 block(width * 4, width * 4, 7, 2), # 256 - 128, RF149 ) self.head nn.Sequential( nn.AdaptiveAvgPool1d(1), # 任意长度 - 1 nn.Flatten(), nn.Dropout(p_drop), nn.Linear(width * 4, n_classes), ) def forward(self, x): # x: (B, C, L) return self.head(self.features(x))注意几个刻意的选择首层 k31、biasFalse后面接 BNbias 会被抵消纯属浪费参数、激活用 LeakyReLU、最后用AdaptiveAvgPool1d(1)支持变长输入。这套配置在 2048 点输入上的感受野是 149 点换算成 25.6 kHz 采样约 5.8 毫秒能覆盖 170 Hz 以上的完整周期。如果数据量很少几百条我会把width降到 16同时把 Dropout 提到 0.4并且加上 weight_decay。如果数据量上万width提到 48 或 64层数可以加到五层。3.3 训练配置与监控指标别只盯着准确率训练循环本身没什么花活关键在超参和监控。import torch.optim as optim model Tiny1DCNN(in_ch1, n_classes4, width32) opt optim.AdamW(model.parameters(), lr1e-3, weight_decay1e-2) sched optim.lr_scheduler.CosineAnnealingLR(opt, T_max60, eta_min1e-5) criterion nn.CrossEntropyLoss(label_smoothing0.05) # 小数据加平滑防过拟合学习率 1e-3 配 AdamW 是我试下来最稳的起点。如果 loss 在前 5 个 epoch 就开始剧烈震荡说明学习率偏大降到 3e-4。如果 loss 下降极慢那可能是归一化没做好或者学习率偏小。余弦退火比固定学习率平均高 1 到 2 个点几乎无成本建议默认带上。label_smoothing这个参数在小样本上很有用把目标从 1.0 压到 0.95 左右能明显缓解预测过于自信的问题验证集的 logloss 会好看很多。监控指标方面准确率是最没用的那一个。类别不平衡的场景下全猜多数类能有 85% 的准确率但模型等于没学到东西。我固定会看三个东西每类的召回率也就是混淆矩阵的对角线除以行和。如果某一类召回率特别低说明这一类被其他类淹没了得考虑加权采样或者 focal loss。验证集损失曲线和训练集损失曲线的分叉点。分叉出现得越早过拟合越严重需要加正则化或者减容量。置信度分布。把所有验证样本的最大 softmax 概率画个直方图如果出现明显的双峰一堆接近 1.0一堆接近 0.25说明模型对一部分样本完全没把握这部分样本值得单独拎出来看看往往是标注错了。我在一个心电分类项目里就是靠置信度分布揪出了 37 条标错的样本。这批样本的模型置信度普遍在 0.3 附近人工复查后发现是类别标签串了。改完之后整体精度涨了 4 个点比调任何超参都管用。3.4 小样本与部署轻量化与迁移的实用做法真实项目里标注数据往往少得可怜。几百条样本想训一个能用的模型除了前面说的减容量、加正则还有几招。数据增强在时序信号上非常有效但必须用物理上合理的增强方式。我常用的有四种叠加高斯白噪声信噪比 10 到 30 dB 随机、随机幅度缩放0.8 到 1.2 倍、随机时间平移不超过窗口的 5%同时补零或用边缘值填充、随机频率抖动轻微重采样模拟转速波动。实测这四种组合能把小样本的验证精度提升 5 到 8 个点。千万不要用随机裁剪再缩放回原长这会改变信号的频率结构等于制造了一堆物理上不存在的伪样本。迁移学习的思路也值得一提。如果手头有一个在相似信号上训过的大模型可以把它的前几层搬过来做特征提取只训最后的分类头。我在一个跨型号设备的项目上试过源域数据八千条、目标域只有三百条冻结前两层、微调后两层目标域精度从 68% 提到 84%。前提是两个域的信号特性不能差太远——如果采样率、传感器类型都变了迁移反而会拖后腿。轻量化部署方面1D-CNN 天生就轻。上面那个 16 万参数的模型转成 ONNX 后不到 700 KB量化到 int8 之后只有 200 KB 出头。量化掉点通常在 0.5 到 1.5 个点之间能接受。要注意的是量化前一定要用真实的校准数据跑一遍校准集要覆盖各个类别的典型样本别随便拿几条均值附近的样本糊弄否则激活值的动态范围估不准掉点会放大到三四个点。4. 常见问题与排查实录4.1 训练集接近满分、验证集崩盘先查泄漏再查过拟合这是最高频的问题十个新手九个撞。看到训练集 98%、验证集 60%第一反应往往是过拟合了加正则但我的经验是先排除数据泄漏再谈过拟合。泄漏的三种典型来源一是前面说的重叠滑窗随机划分二是归一化用了全量数据的统计量三是同一条原始记录被切到了不同集合里。排查方法很粗暴——把验证集换成完全没参与过任何处理的、来自不同批次的原始记录重新跑一遍。如果精度塌了一大截那基本就是泄漏。真正的过拟合特征是训练损失持续下降到 0.001 而验证损失在某个 epoch 之后开始单调上升。这时候的处理顺序是先加数据增强性价比最高再加 weight_decay再减模型容量最后才考虑 Dropout。我见过有人一上来就把 Dropout 拉到 0.7结果模型欠拟合训练损失都降不下去白折腾一周。4.2 损失不收敛或者剧烈震荡的排查顺序按这个顺序查能解决 90% 的情况输入是否归一化。把一批输入打印出来看看数值范围。如果均值是 3000、标准差是 8000那八成没归一化第一层的梯度会直接爆炸。学习率。从 1e-3 开始往下试 3e-4、1e-4。如果 loss 变成 NaN那基本可以确定是学习率太大或者数据里有 NaN。标签范围。CrossEntropyLoss的标签必须是 0 到 C-1 的整数。我遇到过标签从 1 开始编号模型训了三天loss 一直在 1.6 附近改成 0 起始后立刻正常。BN 层的坑。batch size 太小时比如 4BN 的统计量估计不准训练会抖得很厉害。要么把 batch 加到 32 以上要么换成 GroupNorm 或者 LayerNorm。初始化。虽然 PyTorch 的默认初始化还行但如果层数很深可以试试 Kaiming 初始化。4.3 精度卡在某个值上不动的几个隐藏原因这种看起来在学但学不动的情况最磨人。我整理了一份速查表按命中率从高到低排现象可能原因验证方法处理方式精度卡在多数类占比附近类别极不平衡看混淆矩阵某类召回率为 0加权采样 / focal loss某几类互相混淆窗长太短特征没覆盖完整加长窗口重训窗长覆盖 3-5 个周期验证集波动大验证集样本太少看不同随机种子的方差增加验证样本 / 交叉验证整体偏低但训练正常归一化参数不一致对比训练和推理的预处理代码固定训练集统计量精度突然跳变学习率调度器参数不当打印 lr 曲线调整 T_max 或换阶梯衰减特定工况下崩训练集未覆盖该工况按工况分组看精度补数据或做域适配窗长这个问题我特别想多说两句。有个做肌电手势识别的朋友模型精度死活上不去我让他把窗长从 256 点加到 512 点同样的网络结构精度从 76% 涨到 89%。原因是 256 点只覆盖了半个动作周期网络根本看不到完整的手势形态。窗长是个被严重低估的超参它的重要性不比网络结构低。4.4 上线之后才暴露的三个问题实验室里跑通和现场能用中间隔着一道鸿沟。这几个问题都是我在部署阶段实打实遇到的。第一个是推理一致性。训练时用paddingsame配合奇数核推理时如果换了框架比如转 ONNXpadding 的实现方式可能不同——PyTorch 的paddingk//2是两边对称补零某些推理引擎的 SAME 模式是多补在后面两者输出会差几个点累积几层之后精度就飘了。解决办法是把 padding 显式写成固定值别用自适应模式转换后逐层比对输出。第二个是量化掉点。int8 量化在 1D-CNN 上掉点往往比 2D-CNN 明显因为一维信号的动态范围集中激活值的分布更尖锐量化误差更容易放大。我的经验是只量化卷积层BN 和最后的分类头保持 fp32掉点能从 3 个点压到 1 个点以内。另外校准集一定要按类别分层抽样每类至少 50 条。第三个是变长输入。现场的数据流长度不固定有的批次 1500 点有的 4000 点。如果模型里写了固定尺寸的 Flatten直接崩。用全局自适应池化就能解决但要注意 BN 层在长度极短时比如小于 8 点统计量会失真最好在预处理阶段就做长度校验太短的直接丢弃或者补零。还有个容易被忽略的点现场部署后输入数据的分布会随时间缓慢漂移传感器老化、工况变化、季节温湿度。我的做法是在推理端加一个轻量的分布监控定期算一下输入特征的均值和方差偏移超过阈值就触发告警安排重新标注和微调。这套机制比定期无脑重训要靠谱得多。最后分享一个我个人踩得最深的坑不要为了追求结构上的优雅而过度设计。我刚开始做这类项目时特别喜欢堆多尺度并联、注意力门控、残差密集连接模型图看着跟论文似的。后来做消融实验才发现一个朴素的三到四层 1D-CNN 配上正确的预处理效果和那些花哨结构只差 1 到 2 个点而训练时间少一半、调参难度低十倍。真正决定成败的从来是窗长、归一化、数据划分这些不性感的细节网络结构的重要性排在这三者后面。现在我拿到一个新任务的固定动作是先跑一个最朴素的基线把数据管道摸清楚再考虑加结构。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。