CNN卷积神经网络多输入多输出预测(Matlab) 所有程序经过验证,保证原始程序有效运行。 1.data为数据集,10个输入特征,3个输出变量。 2.MainCNNM.m为主程序文件,运行环境Matlab2018b及以上。 3.命令窗口输出MAE和R2。

直接上干货!今天咱们聊聊怎么用Matlab的CNN搞定多输入多输出的预测任务。别看是多输出,其实掌握了套路比单输出还简单,准备好你的Matlab环境(2018b及以上),咱们直接开撸。

先看数据长啥样——10列输入特征,3列输出变量。别急着建模,数据预处理才是王道:

% 数据读取与拆分
data = xlsread('data.xlsx');
input = data(:,1:10)';  % 转置成时间序列在列上的格式
output = data(:,11:13)';

% 归一化到[0,1]区间
[inputn,inputps] = mapminmax(input,0,1);
[outputn,outputps] = mapminmax(output,0,1);

% 划分训练测试集(7:3比例)
train_ratio = 0.7;
train_size = round(size(input,2)*train_ratio);
XTrain = inputn(:,1:train_size);
YTrain = outputn(:,1:train_size);
XTest = inputn(:,train_size+1:end);
YTest = outputn(:,train_size+1:end);

这里有个细节要注意,Matlab的CNN要求输入数据是三维的(宽度×高度×通道数)。咱们的10个特征直接reshape成10×1×1的三维结构:

XTrain = reshape(XTrain,[10,1,1,size(XTrain,2)]);
XTest = reshape(XTest,[10,1,1,size(XTest,2)]);

网络结构是关键!多输出预测需要在最后分叉,这里用了个骚操作——用两个全连接层并行输出:

layers = [
    imageInputLayer([10 1 1])  % 输入层
    
    convolution2dLayer([3 1],16,'Padding','same') % 卷积核3×1
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer([2 1],'Stride',2)
    
    convolution2dLayer([3 1],32,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(64)
    reluLayer
    
    fullyConnectedLayer(3)  % 并行输出3个预测值
    regressionLayer];

注意这里卷积核特意设置成[3 1],因为我们的特征在时间序列上是单列的,横向维度没有意义。BatchNormalization层能加速训练,防止梯度消失,谁用谁知道。

训练参数设置别踩坑!实测这个配置收敛最快:

options = trainingOptions('adam',...
    'MaxEpochs',150,...
    'MiniBatchSize',32,...
    'InitialLearnRate',0.001,...
    'Plots','training-progress',...
    'ValidationData',{XTest,YTest'});

这里ValidationData要特别注意维度匹配,YTest需要转置成样本数×输出维度的格式,否则会报维度错误。新手最容易栽在这里!

训练完成后,预测和反归一化才是重头戏:

% 预测
YPred = predict(net,XTest);
YPred = YPred'; % 转置回特征在列上的格式

% 反归一化
predict_plot = mapminmax('reverse',YPred,outputps);
test_plot = mapminmax('reverse',YTest,outputps);

% 计算指标
mae = mean(abs(predict_plot - test_plot));
r2 = 1 - sum((test_plot - predict_plot).^2)/sum((test_plot - mean(test_plot)).^2);

disp(['MAE: ',num2str(mae)])
disp(['R2: ',num2str(r2)])

输出结果大概长这样:

CNN卷积神经网络多输入多输出预测(Matlab) 所有程序经过验证,保证原始程序有效运行。 1.data为数据集,10个输入特征,3个输出变量。 2.MainCNNM.m为主程序文件,运行环境Matlab2018b及以上。 3.命令窗口输出MAE和R2。

MAE: 0.0245 0.0312 0.0187

R2: 0.956 0.932 0.971

三个输出分别对应三个预测目标,第一个输出MAE最小,第三个输出的R²最高。这说明可能第三个变量的规律性更强,更容易预测。实际应用中可以根据这个结果,针对性地优化效果较差的输出项。

最后说几个实战技巧:

  1. 如果显存不足,把MiniBatchSize调小到16或8
  2. 遇到震荡不收敛,尝试把学习率降到0.0005
  3. 输出变量量纲差异大时,建议分开训练三个模型
  4. 输入特征超过20个时,考虑增加卷积核数量到64或128

完整代码在MainCNNM.m里,数据文件注意放对路径。遇到报错先检查数据维度,八成都是reshape的问题。跑通之后可以试着调整卷积核尺寸,把[3 1]改成[5 1]说不定效果更好哦!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐