回归预测! 手把手实现MATLAB的CNN 卷积神经网络回归
基于MATLAB的深度学习工具箱(推荐2018b以上),实现CNN回归。网上的例子比较少,这里简单的说一下传统的多输入单输出怎么做。手把手的教(PS:MATLAB自带一个回归教程,竟然还是有学生不知道对照着写)
1、首先加载数据与数据集划分
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);
我的输入数据是m*n形式的,m代表有多少个输入特征(如下训练集集数据特征是209个),n是有多少个样本(如下训练集数据样本是700个),输出数据是1*n,1代表输出是单输出。划分后如下

2、数据归一化(或者标准化,看哪个效果好)
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);程序里用的是mapminmax,就是极大极小值归一化,
3、数据的一个转换,转换成MATLAB的CNN的输入数据形式,是4-D形式的,最后一维就是样本数
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模型建立
layers = [
imageInputLayer([209 1 1]) %输入层参数设置
convolution2dLayer([3,1],16,'Padding','same')%卷积层的核大小[3 1],因为我们的输入是[209 1],是一维的数据,所以卷积核第二个参数为1就行了,这样就是1d卷积
%、数量,填充方式
reluLayer%relu激活函数
maxPooling2dLayer([2 1],'Stride',2)% 2x1 kernel stride=2
fullyConnectedLayer(384) % 384 全连接层神经元
reluLayer%relu激活函数
fullyConnectedLayer(384) % 384 全连接层神经元
fullyConnectedLayer(1) % 输出层神经元
regressionLayer];%添加回归层,用于计算损失值
5、模型训练与测试
% 设置迭代次数 batchsize 学习率啥的
options = trainingOptions('adam', ...
'MaxEpochs',20, ...
'MiniBatchSize',16, ...
'InitialLearnRate',0.005, ...
'GradientThreshold',1, ...
'Verbose',false,...
'Plots','training-progress',...
'ValidationData',{testD,targetD_test'});
%这里要吐槽一下,输入数据都是最后一维为样本数,偏偏输出要第一维为样本数,所以targetD和targetD_test都取了转置
% 训练
net = trainNetwork(trainD,targetD',layers,options);
% 预测
YPred = predict(net,testD);
% 结果
YPred=double(YPred');%输出是n*1的single型数据,要转换为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那一句,就看不到验证集(比较懒,没有换分验证集,用的测试集代替)的loss变化,就不方便判断模型有没有过拟合。
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%
相关文章

matlab怎么安装? 手把手教你安装matlab软件的教程
电脑需要安装matlab软件,该怎么安装呢?今天我们提供下载并分享详细的安装图文教程,详细如下2025-01-13
matlab怎么设置plot绘图控制线型和颜色? 附多图对比示例
Matlab 是一种流行的、用于数学计算和数据可视化的编程语言,今天我们就来看看matlab中plot绘图控制线型和颜色设置,多图对比示例如下2025-01-13
matlab怎么指定绘图颜色? matlab自定义绘图颜色的技巧
MATLAB绘图的时候,不喜欢默认颜色,想要更换颜色,该怎么自定义颜色设置呢?详细请看下文介绍2025-01-13
Matlab常用绘图颜色搭配有哪些? matlab绘图颜色代码整理汇总
在MATLAB中绘图时,选择合适的配色方案对于数据的可视化至关重要,整理了一些超实用的MATLAB绘图颜色,它们可以提升图表的吸引力2025-01-13
MATLAB中的条件语句与循环结构怎么使用? 条件语句与循环结构详解
MATLAB提供了多种条件语句和循环结构,下面是对MATLAB中条件语句和循环结构的详细解释,详细如下2025-01-11
在MATLAB中,主要有if、elseif、else和switch语句,我们通过示例代码帮助读者更好地理解if、elseif、else的概念2025-01-11
matlab怎么控制坐标轴范围? Matlab中指定坐标轴范围的教程
在matlab中,设置坐标轴范围是通过修改图形对象属性来实现的,该怎么指定坐标轴范围呢?详细请看下文介绍2025-01-11
线性方程组是数学中一类重要的问题,广泛应用于科学、工程和经济等领域,在Matlab中,我们可以利用内置的函数和工具箱来解决线性方程组,本文将介绍如何使用Matlab求解线性2025-01-11
matlab怎么画函数图像? MATLAB绘制函数图像的实例教程
有时候我们在使用matlab的时候,想画函数图像,怎么画呢,?绘制方法很简单,下面来分享一下2025-01-11
MATLAB如何调用function? 一文看懂functionfunction函数的试用技巧
MATLAB的functions函数,用于查询和调试函数句柄信息,该怎么了解并使用这个函数呢?详细请看下文介绍2025-01-10






最新评论