当前位置: 代码网 > it编程>编程语言>C/C++ > 回归预测! 手把手实现MATLAB的CNN 卷积神经网络回归

回归预测! 手把手实现MATLAB的CNN 卷积神经网络回归

2025年01月14日 C/C++ 我要评论
基于matlab的深度学习工具箱(推荐2018b以上),实现cnn回归。网上的例子比较少,这里简单的说一下传统的多输入单输出怎么做。手把手的教(ps:matlab自带一个回归教程,竟然还是有学生不知道

基于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%
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com