简介:面向Matlab开发者与深度学习入门者的CNN回归预测实现方案,以鲸鱼优化算法(WOA)对卷积神经网络参数进行全局寻优,有效提升模型预测精度,适用于时间序列分析、气象预报、电力需求预测、股票价格预测等连续数值预测场景。资源共13个文件,包括4个MATLAB脚本(含main.m主程序、WOA.m、fun.m、initialization.m等核心代码)、3个Excel数据集表格及6个运行结果图示(含预测对比曲线),压缩包整体约286KB,结构清晰便于检索。代码完整覆盖数据预处理与归一化、CNN卷积池化架构搭建、WOA参数优化、损失函数与优化器配置、模型训练及R²分数等指标评估全流程,并配有实验数据集与结果图像,便于对照验证和二次开发拓展。已有163人学习下载,整体方案可直接运行、注释清晰,适合希望掌握CNN回归建模与智能优化算法结合应用的读者深入参考实践。
1. 用鲸鱼优化算法给CNN当“调参师”:WOA-CNN回归预测到底解决了什么
做过回归预测的人应该都有这种体会:拿到的样本量不大、特征维度不高,但就是很难把预测精度提上去。传统BP网络拟合能力不够,LSTM在小样本上又容易过拟合,而CNN在图像任务里很强,其实对一维时序或表格型回归问题同样有不错的特征提取能力——只是它有两个“劝退”点:一是网络结构参数太多,不知道该把卷积核设多大、放几层;二是学习率、批大小这些超参靠手试,试错成本很高。WOA-CNN这个方案,就是把鲸鱼优化算法(WOA)和卷积神经网络(CNN)串成一个自动寻优的回归预测框架:CNN负责从数据里提特征、做回归拟合,WOA负责在训练之前先把学习率、正则化系数、隐含层节点数这些超参“咬”到合适的范围。这篇文章适合两类人:一类是小样本回归预测做到瓶颈、想换一种不靠手工调参的思路的Matlab用户;另一类是刚接触CNN回归预测,想知道这个“优化算法+神经网络”的组合套路到底怎么落地、参数怎么设、坑在哪的初学者。
2. CNN回归预测的最小可用框架:从一维卷积到全连接输出
2.1 为什么CNN能用在回归预测上:一维卷积的本质是局部特征提取
绝大多数人认识CNN是从图像分类开始的,卷积核在二维平面上滑动,提取边缘、纹理这些空间特征。但回归预测面对的多是一维数据,比如传感器读数的时序、风电功率曲线、轴承振动特征。把一维时序按滑动窗口切成长度为winSize的样本,每个样本就是一个1×winSize的向量。一维卷积核在这条向量上滑动,本质上是在做局部加权求和——卷积核的权值就是一组滤波器,它希望学到的是“哪一段窗口内的数值组合与预测目标强相关”。
这就解释了为什么CNN在小样本回归里比BP网络更有优势:BP网络把整个输入向量拉平成特征,每个位置独立参与计算,没有局部关联的概念;而CNN通过卷积核共享权值,既减少了参数量、又强制模型去关注局部模式。举个例子,如果预测对象是某设备的振动烈度,而振动烈度和前几个时刻的加速度峰值有强相关,那么一个合适的卷积核就能把这个局部模式提取出来,而这种模式用BP的全局连接很难自然学出来。
2.2 搭建CNN回归网络:用trainNetwork定义网络层
在Matlab里搭建CNN回归网络与分类网络有一个关键区别:回归任务的最后一层必须是fullyConnectedLayer + regressionLayer,而不是softmaxLayer + classificationLayer。下面是符合Matlab R2019a及以上版本语法的最小回归CNN定义:
% 输入特征维度为 featureDim,时间窗口为 winSize % XTrain 大小为 featureDim × winSize × 1 × numSamples layers = [ imageInputLayer([featureDim winSize 1], 'Name', 'input') convolution2dLayer([3 3], 8, 'Padding', 'same', 'Name', 'conv1') batchNormalizationLayer('Name', 'bn1') reluLayer('Name', 'relu1') maxPooling2dLayer([2 2], 'Stride', [2 2], 'Name', 'pool1') convolution2dLayer([3 3], 16, 'Padding', 'same', 'Name', 'conv2') batchNormalizationLayer('Name', 'bn2') reluLayer('Name', 'relu2') fullyConnectedLayer(32, 'Name', 'fc1') dropoutLayer(0.2, 'Name', 'dropout') fullyConnectedLayer(1, 'Name', 'fc_out') regressionLayer('Name', 'reg_out') ];这段代码里的imageInputLayer接收的是featureDim×winSize×1×numSamples的四维数组,所以无论如何都要把原始数据reshape成四维。convolution2dLayer的第一个参数是卷积核大小,这里是[3 3],在图像任务里3×3是标准选择;但对一维数据,严谨一点应该用[3 1]或[5 1]这种只在时间维滑动的核,不过Matlab的convolution2dLayer只支持二维,实践中把时间窗口当作行、特征当作列,用3×3核也能收敛,只是语义上稍有不同。batchNormalizationLayer放在卷积后面、激活函数前面,作用是压制内部协变量偏移,对调参难度高的网络很有效。
dropoutLayer我一般取0.2,太小起不到正则作用,太大会让网络学不动。fullyConnectedLayer最后输出1个节点,对应回归目标值。regressionLayer自动计算均方误差损失并反向传播。
2.3 数据组织与训练选项:这些参数决定你能不能收敛
CNN回归预测的输入数据组织是新手第一道坎。原始数据是一个N×featureDim的矩阵,N为样本总数。要做时序预测,得按滑动窗口切数据,得到N-winSize+1个样本,每个样本含winSize个历史时刻。然后要把每个样本变成featureDim×winSize×1的格式,最后把numSamples批到第四维。
% data: N x featureDim 原始数据(已归一化) % winSize: 滑动窗口长度 % numSamples = N - winSize + 1 XTrain = zeros(featureDim, winSize, 1, numSamples); for i = 1:numSamples XTrain(:, :, 1, i) = data(i:i+winSize-1, :)'; end % YTrain 是每个窗口对应的目标值 YTrain = data(winSize+1:end, targetCol);训练选项这块,我建议直接给一组“大概率能跑通”的参数:
options = trainingOptions('adam', ... 'MaxEpochs', 200, ... 'MiniBatchSize', 32, ... 'InitialLearnRate', 0.001, ... 'ValidationData', {XVal, YVal}, ... 'ValidationFrequency', 20, ... 'Plots', 'training-progress', ... 'Verbose', false);adam优化器在大多数回归任务里优于sgdm,尤其在小样本下收敛更稳。InitialLearnRate设0.001是安全值,WOA后面要寻优的也是这个参数。MaxEpochs不要太小,小样本下200轮一般能收敛。MiniBatchSize在样本量少于500时可以用16或32,再大容易欠拟合。
这一整套模板跑通之后,你手上就有了一个“能用的CNN回归器”。但它是裸奔的——学习率、批大小、卷积核数量全是拍脑袋定的,接下来WOA要干的事情就是把这些超参从“拍脑袋”变成“搜出来的”。
3. 鲸鱼优化算法WOA:它凭什么能当CNN的寻优引擎
3.1 WOA的寻优逻辑:泡泡网捕食与三个阶段
鲸鱼优化算法是Mirjalili在2016年提出的群智能优化算法,模拟座头鲸的泡泡网捕食行为。它的核心逻辑分三个阶段:包围猎物、气泡攻击、随机搜索。在Matlab里实现WOA的成本非常低,不需要额外的工具箱,几十行代码就能写出来。它和遗传算法、粒子群的最大区别在于:WOA没有交叉和变异,靠的是位置更新的数学公式直接迭代,参数更少、实现更简单。
具体到WOA-CNN这个组合里,每个鲸鱼个体就是一个候选解,变量是把CNN那套超参数编码成的向量。常见的编码是[InitialLearnRate, MiniBatchSize, NumFilters, DropoutRate, L2Regularization]五个变量。WOA迭代时,每个个体用当前的超参数组合去训练一次CNN,用验证集上的均方误差作为适应度值。适应度越小(验证集误差越低),说明这组超参数越好。WOA通过收缩包围圈和螺旋更新两种策略,逐步把种群推向适应度最优的区域。
function [bestSol, bestFitness, curve] = woa_cnn_search(fitnessFunc, dim, lb, ub, SearchAgents, MaxIter) % fitnessFunc: 输入为超参向量,输出为验证集MSE % dim: 超参数个数 % lb, ub: 超参数下界和上界 % SearchAgents: 种群大小,一般取10-20 % MaxIter: 最大迭代次数,一般取10-20 % 初始化种群位置 Positions = rand(SearchAgents, dim) .* (ub - lb) + lb; BestFitness = inf; for t = 1:MaxIter a = 2 - t * (2 / MaxIter); % a从2线性降到0 for i = 1:SearchAgents % 计算适应度 Fitness = fitnessFunc(Positions(i, :)); if Fitness < BestFitness BestFitness = Fitness; BestSol = Positions(i, :); end end % 更新位置 for i = 1:SearchAgents r = rand(); A = 2 * a * rand() - a; C = 2 * rand(); p = rand(); if p < 0.5 if abs(A) < 1 % 包围猎物 D = abs(C * BestSol - Positions(i, :)); Positions(i, :) = BestSol - A * D; else % 随机搜索 randIdx = randi(SearchAgents); D = abs(C * Positions(randIdx, :) - Positions(i, :)); Positions(i, :) = Positions(randIdx, :) - A * D; end else % 气泡攻击(螺旋更新) dist = abs(BestSol - Positions(i, :)); l = (rand() - 0.5) * 2; Positions(i, :) = dist .* exp(l) .* cos(2 * pi * l) + BestSol; end % 边界处理 Positions(i, :) = max(min(Positions(i, :), ub), lb); end curve(t) = BestFitness; end end这段WOA代码是按教科书套路写的,实际用起来有两个要注意的点:一是p和A是逐个体随机生成的,种群多样性靠这两个随机数维持,所以种群太小(少于10)会导致早熟收敛;二是边界处理用的是硬截断,如果某个超参的值越过边界,直接就贴到边界上,这在学习率这种对数尺度变量上会有问题。后面避坑章节我会细讲。
3.2 把CNN训练包成绩效函数:WOA与Matlab训练流程对接
WOA本身不关心你训练的是什么模型,它只需要一个输入超参向量、输出一个标量适应度的函数句柄。关键问题在于训练CNN一次可能要几十秒,WOA迭代20次、种群15个,就是300次CNN训练,在小样本上还能接受,但如果不做训练加速和缓存优化,总时长会让人怀疑人生。
function mse = cnnFitness(params) % params 格式: [InitialLearnRate, NumFilters, DropoutRate] lr = params(1); numFilters = round(params(2)); % 滤波器数量必须是整数 dropoutRate = params(3); % 根据numFilters动态构建网络 layers = [ imageInputLayer([featureDim winSize 1]) convolution2dLayer([3 3], numFilters, 'Padding', 'same') batchNormalizationLayer reluLayer fullyConnectedLayer(32) dropoutLayer(dropoutRate) fullyConnectedLayer(1) regressionLayer ]; options = trainingOptions('adam', ... 'MaxEpochs', 80, ... 'MiniBatchSize', 32, ... 'InitialLearnRate', lr, ... 'Verbose', false); net = trainNetwork(XTrain, YTrain, layers, options); YPredict = predict(net, XVal); mse = mean((YPredict - YVal).^2); end这里有几个设计取舍必须说清楚。第一,MiniBatchSize没有放进寻优变量里,因为它的影响是离散且非平滑的,WOA这类连续优化算法对离散变量不友好,强行放进去会让适应度曲面出现大量台阶,严重影响收敛。第二,每次WOA评估都要从头训练一次CNN,初始权重不同会导致同一个超参组合训练两次得到不同的MSE,这在优化算法里叫“噪声适应度”。常见做法是训练前固定随机种子,或者对同一个超参组合评估两到三次取平均。我一般用rng(42)固定种子,省时间、可复现。第三,适应度函数里的MaxEpochs设为80,比最终要用的200轮少得多,这是故意为之——寻优阶段不求精度最高,只求相对好坏能分出来,选完之后用最优参数再训一次完整模型。
3.3 WOA为什么不选遗传算法或粒子群:小样本场景下的对比感受
做回归预测的超参寻优,其实有不少现成工具,Matlab自带的fitrnet没有自动寻优,要用别的就得找第三方工具箱或者自己写。常见的替代方案是贝叶斯优化(bayesopt),Matlab内置支持,理论上比WOA更高效——它建模的是“超参空间到验证误差”的概率代理模型,迭代十几轮就能锁定比较好的区域。但贝叶斯优化在超高维超参空间和极度非线性响应面上,容易陷入局部最优的困境。WOA的优势体现在三个地方:实现代码短且逻辑透明,出问题时容易排查;对非光滑的适应度曲面鲁棒性相对好;不用像遗传算法那样设置交叉率、变异率等一堆额外参数。
当然WOA也有明显的坑:它是一个无免费午餐的搜索算法,在没有足够迭代次数的情况下,搜索质量很大程度取决于初始种群的分布。种群初始化用均匀分布还是用拉丁超立方,对最终结果的影响比大多数人想象的大。后面避坑章节里我会讲怎么处理这个问题。
4. 跑通WOA-CNN整体流程:从数据预处理到完整训练脚本
4.1 一份可以直接改的完整流程伪代码
把前面各模块拼起来,完整的WOA-CNN回归预测流程按下面的顺序走:
% ====== 1. 数据加载与归一化 ====== load('data.mat', 'data'); % data: N x featureDim [N, featureDim] = size(data); targetCol = 1; % 目标列 % 归一化到[0,1]区间,训练和测试用同一组参数 dataNorm = mapminmax(data', 0, 1)'; % 注意:mapminmax按行归一化,所以需要转置两次 % ====== 2. 划分训练集和测试集 ====== trainRatio = 0.8; trainN = floor(N * trainRatio); dataTrain = dataNorm(1:trainN, :); dataTest = dataNorm(trainN+1:end, :); % ====== 3. 滑动窗口建样本 ====== winSize = 10; [XTr, YTr] = createSlidingWindow(dataTrain, winSize, targetCol); [XTe, YTe] = createSlidingWindow(dataTest, winSize, targetCol); % ====== 4. 用WOA搜索超参数 ====== % 搜索边界: [学习率, 卷积核数量, dropout] lb = [0.0001, 4, 0]; ub = [0.01, 32, 0.5]; fitnessFunc = @(p) cnnFitness(p, XTr, YTr, XTe, YTe); [bestParams, bestMSE, curve] = woa_cnn_search(fitnessFunc, 3, lb, ub, 15, 20); % ====== 5. 用最优参数训练最终模型 ====== finalLayers = buildCNN(bestParams, featureDim, winSize); options = trainingOptions('adam', ... 'MaxEpochs', 200, ... 'MiniBatchSize', 32, ... 'InitialLearnRate', bestParams(1), ... 'Plots', 'training-progress'); finalNet = trainNetwork(XTr, YTr, finalLayers, options); % ====== 6. 预测与反归一化 ====== YPred = predict(finalNet, XTe); YPredReal = mapminmax('reverse', YPred', 0, 1)'; YTestReal = mapminmax('reverse', YTe', 0, 1)'; % ====== 7. 误差指标 ====== rmse = sqrt(mean((YPredReal - YTestReal).^2)); mae = mean(abs(YPredReal - YTestReal)); fprintf('RMSE: %.4f, MAE: %.4f\n', rmse, mae);这段脚本里createSlidingWindow函数按前面2.3节的方式实现,buildCNN函数按2.2节的方式实现。注意归一化在整体流程里的位置:必须先归一化再切窗口,而不是切完窗口再归一化。因为mapminmax的参数(均值和标准差)应该用训练集的统计量,如果先切窗口再整体归一化,会把验证集和测试集的信息泄露进训练过程,导致验证误差偏低、上线后翻车。
划分训练集和测试集时有一个小样本场景容易忽视的点:如果用随机抽样的方式划分,时序数据的顺序会被打乱,模型会“偷看”到未来数据。严格来说,时序回归预测必须按时间顺序切分——前80%做训练,后20%做测试。很多新手在这里踩坑,以为随机划分能提升泛化性,实际上得到的预测误差根本不代表真实部署时的表现。
4.2 计算成本估算:什么时候适合用WOA-CNN
WOA-CNN的计算成本和数据集规模强相关。假设原始数据有1000个样本,winSize取10,滑窗后约有990个样本。训练一个CNN 200轮的耗时在普通台式机上大约10到30秒,WOA寻优阶段每个个体训练80轮约4到12秒,种群15个、迭代20次,总共300次训练,光寻优阶段就要20到60分钟。这还不算最终模型的训练。所以如果你的数据规模到了几万条样本、每条特征维度几十个,单次CNN训练就要几分钟,WOA-CNN的整体耗时可能超过十小时,这时候更推荐的做法是先抽小样做WOA寻优,拿到超参后在全体数据上做最终训练。
有一个加速技巧在实践中很管用:WOA寻优阶段的CNN网络结构可以减薄一层卷积,MaxEpochs降到30到40轮,BatchSize加大到64。这样单次训练时间可以压到原来的三分之一左右,而超参的相对优劣关系基本还能保持——因为真正最终决定精度的通常是学习率和正则化强度的组合,而不是网络的绝对训练充分程度。
4.3 最终模型的预测效果怎么看:残差和图一起上
WOA-CNN跑完别只看RMSE就收工。我一般会画三张图:第一张是真实值和预测值的对比曲线,看趋势跟随是否到位;第二张是残差分布直方图,看残差是否近似零均值正态分布;第三张是残差与预测值散点图,看是否存在异方差——如果残差随预测值增大而增大,说明模型在小值区域拟合还行但大值区域有系统性偏差。这三张图能帮判断:问题到底是数据预处理不当(比如归一化遗漏了异常值)、特征信息不足(滑动窗口太小),还是超参没搜到点子上。诊断逻辑和调参方向在下一章展开。
% 残差分析 residual = YPredReal - YTestReal; figure; subplot(2,1,1); histogram(residual, 20); title('Residual Distribution'); xlabel('Residual'); ylabel('Count'); subplot(2,1,2); scatter(YPredReal, residual, 10, 'filled'); xlabel('Predicted Value'); ylabel('Residual');如果残差分布明显左偏或右偏,先检查数据归一化是否用了全局最大最小值而不是训练集统计量;如果残差方差在某个预测区间显著变大,考虑对目标列做log变换后再训练。
5. WOA-CNN实战避坑:5个能让你少熬夜的具体问题
5.1 归一化把异常值扩成整个区间,模型被“绑架”
现象:训练出来的模型在大多数区间预测得还不错,但一到数据的尖峰区域,预测值严重偏低或者偏高,RMSE被几个点拉爆。 原因:mapminmax默认把整个序列的最小值和最大值映射到0和1,如果原始数据里有传感器毛刺或跳变异常值,正常数据的归一化范围会被压缩到0.1到0.9甚至更窄,CNN学到的有效信息分辨率被稀释了。 解决:归一化前先用箱线图或3σ准则把极端异常值识别出来,做截断或平滑,再计算归一化参数。更好的做法是对目标列单独做分位数归一化,压住长尾。
5.2 学习率作为WOA变量时用线性边界导致搜索无效
现象:WOA搜出来的最优学习率永远贴在下界0.0001或上界0.01,而且每次跑结果都不一样。 原因:学习率对模型的影响是指数尺度的——0.01和0.001的差异,远比0.001和0.0002的差异重要得多。WOA的位置更新公式是线性的,在线性空间里搜索指数尺度的变量,每一步移动的分辨率不均匀,小学习率区域很难被精细搜索。 解决:让适应度函数内部对学习率做对数转换。传给WOA的变量范围是[-4, -2],适应度函数里用10^params(1)还原成实际学习率。类似的对数变量还有L2正则化系数。
function mse = cnnFitness(params, XTr, YTr, XTe, YTe) lr = 10^params(1); % params(1) 范围 [-4, -2] 对应 [0.0001, 0.01] numFilters = round(params(2)); dropoutRate = params(3); % ... 其余训练代码同上 end5.3 阶段性和随机性让同组超参数两次训练得到不同的MSE
现象:WOA在第10代找到一个超参组合,适应度是0.0032,记录为最优。但用同样的超参组合再训练一次,MSE却变成0.0041,最终用这个组合训出的模型表现不稳定。 原因:CNN权重初始化是随机的,批次采样也是随机的,训练过程的随机性让同一个超参组合在不同随机种子下得到不同结果。WOA基于这些含噪声的适应度做选择,很容易把“碰巧好”的组合误判为“真正好”。 解决:固定随机种子是最低成本方案。在每次训练前加rng(42),保证同一超参数组合在任何时刻评估都会得到完全一样的MSE。但要注意,固定种子也会让寻优结果对种子本身有过拟合。我的折中做法是寻优阶段固定种子做粗选,最后对Top 3超参组合各用3个不同种子训练取平均,再选最终模型。
5.4 WOA搜索空间边界太宽导致大量无效训练
现象:WOA迭代了十几代,适应度曲线几乎不下降,看训练日志发现适应度函数里网络要么不收敛、要么过拟合。 原因:搜索边界设置不当。比如MiniBatchSize被允许取1到256,小批量在大范围跳动会让训练曲线剧烈震荡;卷积核数量如果允许取到100多,网络参数规模和小样本完全不匹配。 解决:边界要基于任务性质先做一轮预判,而不是简单给个很宽的区间。小样本回归我实际用的边界是:学习率[1e-4, 1e-2](对数编码)、卷积核数量[4, 32]、Dropout[0, 0.5]、L2正则[1e-5, 1e-2](对数编码)、BatchSize固定32不参与寻优。这样把搜索空间限定在“大概率能跑出合理模型的子空间”,WOA的搜索效率会明显提升。
5.5 预测值与真实值的相关系数高但RMSE也高
现象:对比曲线上看趋势跟得很好,但RMSE数值比预期高很多。 原因:模型学到的是数据的整体趋势和相位滞后的混合体。如果预测曲线比真实曲线滞后1到2个时间步,相关系数依然很高,但逐点误差会很大。这在有强自相关的时序数据上特别常见。 解决:用动态时间规整或直接看滞后相关性,不要只看RMSE或R²。如果确认存在滞后偏差,把滑动窗口的预测目标从“预测下一时刻”改成“预测未来k个时刻”(k大于窗口感受野),或者在训练时把输入窗口向后多移几个时间步,给模型更充足的上下文。更彻底的方案是在数据预处理时对输入序列做一阶差分去除趋势,用差分后的平稳序列做训练,预测值再累加还原。
6. 从“能跑”到“可信”:WOA-CNN的验证方法与进阶技巧
WOA-CNN跑通之后,真正的工程问题不是“代码有没有跑出数字”,而是“这套超参组合换一批数据还能不能用”。我把这个阶段叫“可信度验证”,分三层来做。第一层是稳定性验证:把数据集按时间滑窗切成多个训练/测试切片,比如1000条样本切成5段,每段前80%训练、后20%测试,让WOA独立跑5轮。观察最优超参是否集中在某个区域——如果5轮搜出来的学习率都在1e-3附近波动,说明这个值是数据本身的规律,而不是运气;如果5轮结果差异巨大,说明搜索没有收敛或者数据信息量不足,这时候不要急着部署模型,先增大数据量或调整特征。第二层是消融对比:把WOA-CNN和固定超参的CNN(用你第一版拍脑袋的参数)、以及WOA-BP(把CNN换成BP网络)放在同一数据上对比。这一步能回答最关键的问题——精度提升到底是WOA调参的功劳、CNN特征提取的功劳、还是单纯因为多跑了几次训练。第三层是残差与置信区间分析:对测试集的残差做正态性检验,如果残差不服从正态,预测的置信区间就没有意义。
验证通过之后,还有一个很实用的进阶技巧:把WOA搜出来的最优解当作“初始点”,用fmincon或patternsearch做局部精调。WOA在大范围搜索上表现好,但局部收敛的精度不如传统优化算法,先用WOA锁定大致区域,再用局部优化器在这个区域里精调,能进一步压低MSE。代价是总耗时增加10%左右,收益通常在2%到5%的精度提升。
另外一个容易被忽略的细节是把WOA迭代过程的适应度曲线保存下来。我习惯在WOA-CNN跑完以后,把curve数组画出来,看它是平滑下降还是剧烈震荡。平滑下降说明搜索过程合理;剧烈震荡说明适应度噪声没压住,或者搜索步长过大。这一步能帮你判断要不要调整种群大小或迭代次数,而不是黑匣子跑完就完事。
最后说一个我的个人习惯:每跑完一组WOA-CNN,我会把最优超参数、验证MSE、训练耗时、数据规模、滑动窗口大小记录在一个Excel表里,坚持几个月后,你会慢慢总结出自己常碰到的数据类别下超参的大致范围。下次再遇到同类问题,直接在这个范围内设边界,WOA的收敛速度和最终精度都会明显好过从零开始。这套方法的坑不少,但值得做——因为超参寻优这件事,本来就是做得越多、越能预判。希望帮到你。
本文还有配套的精品资源,点击获取