MATLAB深度学习实战:手把手实现CNN卷积神经网络回归预测
引言
在MATLAB深度学习工具箱(推荐2018b及以上版本)中,卷积神经网络(CNN)不仅可用于分类任务,同样适用于回归预测问题。然而,网上关于CNN回归的示例相对较少,尤其是多输入单输出场景的完整实现。本文将手把手演示如何利用MATLAB构建并训练一个CNN回归模型,帮助读者快速上手。
1. 数据加载与数据集划分
首先,我们需要加载数据并将其划分为训练集和测试集。假设输入数据为m×n矩阵,其中m表示输入特征数量,n表示样本数量;输出数据为1×n向量,表示单输出变量。
clc;clear;close all
load data
n=700;
train_x=input(:,1:n);
train_y=output(:,1:n);
test_x=input(:,n+1:end);
test_y=output(:,n+1:end);例如,训练集包含209个特征和700个样本,测试集则包含剩余的311个样本。
2. 数据归一化处理
为了提升模型训练效果,通常需要对数据进行归一化或标准化处理。这里使用mapminmax函数实现极大极小值归一化,也可根据实际效果选择mapstd标准化。
method=@mapminmax; % method=@mapstd;
[train_x,train_ps]=method(train_x);
test_x=method('apply',test_x,train_ps);
[train_y,output_ps]=method(train_y);
test_y=method('apply',test_y,output_ps);3. 数据格式转换
MATLAB的CNN输入要求为4-D数据格式,即[高度, 宽度, 通道数, 样本数]。对于一维特征数据,需将其重塑为[特征数, 1, 1, 样本数]的形式。
trainD=reshape(train_x,[209,1,1,700]); % 训练集输入
testD=reshape(test_x,[209,1,1,311]); % 测试集输入
targetD = train_y; % 训练集输出
targetD_test = test_y; % 测试集输出转换后,训练集输入的size为209×1×1×700,输出size为1×700。
4. CNN模型构建
接下来,构建适用于回归任务的CNN网络结构。由于输入数据是一维特征,卷积核的第二个维度设为1,以实现一维卷积操作。
layers = [
imageInputLayer([209 1 1]) % 输入层
convolution2dLayer([3,1],16,'Padding','same') % 卷积层,核大小[3,1],16个滤波器
reluLayer % ReLU激活函数
maxPooling2dLayer([2 1],'Stride',2) % 最大池化层
fullyConnectedLayer(384) % 全连接层,384个神经元
reluLayer
fullyConnectedLayer(384)
fullyConnectedLayer(1) % 输出层,单输出
regressionLayer]; % 回归层,用于计算损失5. 模型训练与测试
设置训练选项,包括优化器、迭代次数、批大小、学习率等。注意,输入数据的样本维度在最后一维,而输出数据的样本维度在第一维,因此需要对输出数据进行转置。
options = trainingOptions('adam', ...
'MaxEpochs',20, ...
'MiniBatchSize',16, ...
'InitialLearnRate',0.005, ...
'GradientThreshold',1, ...
'Verbose',false,...
'Plots','training-progress',...
'ValidationData',{testD,targetD_test'}); % 使用测试集作为验证集
net = trainNetwork(trainD,targetD',layers,options); % 训练网络
YPred = predict(net,testD); % 预测
YPred=double(YPred'); % 转换为1×n的double类型
% 反归一化
predict_value=method('reverse',YPred,output_ps);
predict_value=double(predict_value);
true_value=method('reverse',targetD_test,output_ps);
true_value=double(true_value);在options中设置ValidationData参数,可以观察验证集(此处用测试集代替)的损失变化,便于判断模型是否过拟合。
6. 模型评估
最后,通过绘制实际值与预测值的对比曲线,并计算常用回归评价指标来评估模型性能。
figure
plot(true_value,'-*','linewidth',3)
hold on
plot(predict_value,'-s','linewidth',3)
legend('实际值','预测值')
grid on
rmse=sqrt(mean((true_value-predict_value).^2));
disp(['根均方差(RMSE):',num2str(rmse)])
mae=mean(abs(true_value-predict_value));
disp(['平均绝对误差(MAE):',num2str(mae)])
mape=mean(abs((true_value-predict_value)./true_value));
disp(['平均相对百分误差(MAPE):',num2str(mape*100),'%'])示例运行结果如下:
根均方差(RMSE):9.3368e-05
平均绝对误差(MAE):6.9173e-05
平均相对百分误差(MAPE):0.0069244%从结果可以看出,模型在测试集上取得了较高的预测精度,验证了该CNN回归方法的有效性。
原文链接:本站整理
本文来自互联网用户投稿,该文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 service@2cto.cc 进行投诉反馈,一经查实,立即处理!
您可能感兴趣的文章:
下一篇:UltraEdit 如何关闭自动更新?禁止自动检测更新的详细操作步骤