基于卷积神经网络(CNN)的数据回归预测

一、代码原理

1.卷积神经网络原理

卷积神经网络(Convolutional Neural Networks, CNN)是包含卷积计算且具有深度结构的前馈神经网络,主要由三部分组成:卷积层、池化层和全连接层,其基本型的完整架构展示具体结构如图1所示。

图1 卷积神经网络示意图

(1) 卷积层

在CNN中卷积层位于关键位置,其主要功能是对输入数据进行特征提取。借助卷积运算,卷积层能够有效捕获数据中的重要特征,并加强原始信号中的关键特征,同时有效减少特征的维度。卷积核根据预先设定的参数在特征图上执行扫描运算,从而生成输出特征,其中二维卷积神经网络的卷积过程如图2所示。

图2 卷积过程图

卷积层存在两个主要缺陷:1) 数据边界的限制导致边缘信息丢失,边缘数据仅对少数输出数据有影响,而中间数据影响更多,使得边缘信息难以充分利用; 2) 随着卷积层数增多,输出数据尺寸逐渐缩小,限制了深度卷积神经网络的应用。填充技术解决这两个问题,通过在输入数据边界外填充某些特定的值(一般是 0),增大输入数据尺寸,保持输出数据尺寸不缩减,提高边界数据对输出的影响,采用填充技术后卷积运算过程如图3所示。

图3 填充技术及其卷积结果

(2) 池化层

池化层通过对卷积层输出的特征进行进一步筛选,提取更具代表性和重要性的特征信息,实现降维效果[71],池化层卷积操作如图4所示。

图4 池化层卷积图

(3) 激活层

激活层引入非线性性,通过对全连接层的输出或卷积层的输出应用激活函数(Activation Function),使网络能够学习更复杂的模式。常用的激活函数有下面几种。

Sigmoid激活函数以其单调递增以及反函数单调递增等特性而被广泛应用作为神经网络的阈值函数。该函数能有效将输入的连续实值映射为介于0和1之间的输出,对每个神经元的输出进行了标准化。其函数曲线图像如下图5所示。

图5 Sigmoid函数示意图

(2)  Tanh 激活函数

Tanh激活函数是在Sigmoid函数基础上为解决均值问题而提出的一种激活函数[88]。它的图像与Sigmoid函数类似,但不同的是Tanh函数的取值范围在-1和1之间,并且以0为中心,从而解决了Sigmoid函数输出不关于零点对称的问题。由于Tanh函数的值域分布在0附近,对于具有强负、中性和强正值的输入,它能够更轻松地进行建模,相比Sigmoid函数,Tanh函数的收敛速度更快。函数曲线图像如下图6所示。

图6 Tanh函数示意图

(3)  ReLU 激活函数

ReLU激活函数是当前深度卷积神经网络中最为常用的一种激活函数,旨在解决Sigmoid函数和Tanh函数存在的梯度消失问题。其引入有效地加速了网络训练速度,提高了收敛速度,并降低了计算复杂度。相比之下,ReLU函数表现出更强的鲁棒性,对各种干扰更为稳健,即使在无监督预训练的情况下也能展现良好性能。其函数曲线图像如下图7所 示。

图7 ReLU函数示意图

(4) 全连接层

全连接层位于卷积神经网络(CNN)的末端,用于整合CNN提取的特征,并进行回归分析。全连接层包含参数较多,能有效提升数据拟合精度。根据任务类型,在全连接层中添加相应的函数,并引入Dropout。Dropout在模型训练期间,通过随机地忽略一部分神经元,来增强模型的非线性能力和鲁棒性,同时提升计算能力和速度。Dropout结构如图4.8所示。

图8 Dropout结构图

2.基于卷积神经网络(CNN)的数据回归预测简单原理及流程

双向门控循环单元(BI-GRU)是一种强大的深度学习模型,常用于时间序列预测和数据回归任务。以下是关于基于BI-GRU进行数据回归预测的简要介绍和步骤:

基于卷积神经网络(CNN)的数据回归预测主要包括以下几个步骤:

(1)数据准备:

  • 收集和整理需要用于回归预测的输入数据和目标值(即标签)。
  • 对数据进行预处理,例如归一化或标准化,以确保数据在同一范围内,便于网络训练。

(2)模型构建:

  • 构建卷积神经网络模型,通常包括输入层、若干个卷积层、池化层、全连接层以及输出层。
  • 卷积层用于提取数据中的特征,池化层用于减少特征图的尺寸,从而降低计算复杂度和防止过拟合。

(3)模型训练:

  • 将预处理后的数据输入到构建好的CNN模型中。
  • 通过定义的损失函数(如均方误差)来评估模型预测值与实际值之间的差异。
  • 使用优化算法(如梯度下降)调整模型参数,使损失函数的值逐步减小,从而提高模型的预测精度。

(4)模型评估:

  • 使用验证数据集对训练好的模型进行评估,以检测其预测性能和泛化能力。
  • 通过一些评价指标(如均方误差、平均绝对误差)来量化模型的预测效果。

(5)模型优化:

  • 根据评估结果,对模型进行调整和优化,可能需要调整网络结构、优化算法或超参数。
  • 反复进行训练和评估,直到模型性能达到预期标准。

(6)模型预测:

  • 使用训练好的CNN模型对新数据进行回归预测,输出预测值。
  • 根据需求,对预测结果进行后处理或应用。

二、部分代码

%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc  
%% 导入数据
data =  readmatrix('回归数据集.xlsx');
data = data(:,1:14);
res=data(randperm(size(data,1)),:);    %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
num_samples = size(res,1);   %样本个数
% 训练集和测试集划分
outdim = 1;                                  % 最后一列为输出
num_size = 0.7;                              % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim;                  % 输入特征维度
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%%  数据平铺
trainD =  double(reshape(p_train,size(p_train,1),1,1,size(p_train,2)));
testD  =  double(reshape(p_test,size(p_test,1),1,1,size(p_test,2)));
targetD =  t_train;
targetD_test  =  t_test;
%  创建CNN网络,
layers = [
    imageInputLayer([size(p_train,1) 1 1], "Name","sequence")
    
    convolution2dLayer([3,1],16,'Padding','same')         % 卷积核大小为3*1 生成16个卷积
    
    batchNormalizationLayer                               % 批归一化层
    reluLayer                                             %relu激活函数
    
    maxPooling2dLayer([2 1],'Stride',2)% 2x1 kernel stride=2
    fullyConnectedLayer(25) % 全连接层神经元
    
    reluLayer                       %relu激活函数
    fullyConnectedLayer(1)      % 输出层神经元
    regressionLayer];%添加回归层,用于计算损失值 

三、代码效果图

获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复数据回归预测本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB科研小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值