卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于处理具有网格结构数据的任务,如图像和视频识别、语音识别、自然语言处理等。
CNN组成介绍
CNN 包含了以下主要组成部分:
卷积层(Convolutional Layers):卷积操作是 CNN 的核心。卷积层使用滤波器(也称为卷积核)来扫描输入数据,从而识别图像中的特征,如边缘、纹理和形状。
池化层(Pooling Layers):池化层用于减小数据维度和降低计算复杂度。最大池化和平均池化是常见的池化操作,它们通过从局部区域中提取最大值或平均值来减小输入的尺寸。
全连接层(Fully Connected Layers):全连接层将池化层的输出连接到神经网络的输出层。这些层负责将提取的特征映射映射到特定的类别或标签。
激活函数(Activation Functions):在每个卷积层和全连接层之后通常会应用非线性激活函数,如ReLU(Rectified Linear Unit)。这些函数帮助网络学会复杂的非线性关系。
CNN 的训练过程通常涉及使用大量带有标签的数据来优化网络的权重和偏差,以便进行分类、回归或其他任务。常见的优化算法包括随机梯度下降(SGD)以及其变种。
CNN程序介绍
该代码是一个完整的卷积神经网络(CNN)训练和评估过程,使用MATLAB2023b来实现,针对一个数据集执行分类任务。以下是代码的逐步介绍:
清空环境变量—导入数据;
随机划分训练集和测试集;
数据归一化—数据平铺;
构造卷积神经网络:
参数设置;
分析网络结构;
训练CNN—训练集预测;
绘图;
CNN程序结果
、
程序部分
%% 清空环境变量
clear
clc
warning off
%% 导入数据
data= xlsread('特征数据带标签.xlsx'); %1:20列为数据特征,第21列为样本所属的类别;每一行为一个样本共计400个样本
%% 随机划分训练集和测试集
temp = randperm(400);
% 训练集——400个样本
P_train = data(temp(1:350),1:20)';
T_train = data(temp(1:350),21)';
M = size(P_train,2);
% 测试集——50个样本
P_test = data(temp(351:end),1:20)';
T_test = data(temp(351:end),21)';
N = size(P_test,2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
t_train = T_train;
t_test = T_test;
%% 数据平铺
p_train = double(reshape(p_train,20,1,1,M));
p_test = double(reshape(p_test,20,1,1,N));
t_train = categorical(t_train)';
t_test = categorical(t_test)';
%% 构造卷积神经网络
layers = [
imageInputLayer([20 1 1])
convolution2dLayer([2 1], 16) % 卷积核大小为3*3 生成16个卷积
batchNormalizationLayer % 批归一化层
reluLayer % relu激活层
maxPooling2dLayer([2 1],'Stride',1) % 最大池化层 大小为2*2 步长为2
convolution2dLayer([2 1], 32) % 卷积核大小为3*3 生成32个卷积
batchNormalizationLayer % 批归一化层
reluLayer % relu激活层
maxPooling2dLayer([2 1],'Stride',1) % 最大池化层 大小为2*2 步长为2
fullyConnectedLayer(8)
softmaxLayer
classificationLayer];
% 参数设置
options = trainingOptions('sgdm',... % SGDM 梯度下降算法
'MiniBatchSize',10,... % 批大小 每次训练样本个数10
'MaxEpochs',50,... % 最大训练次数 50
'InitialLearnRate',1e-2,... % 初始学习率为0.01
'LearnRateSchedule','piecewise',... % 学习率下降
'LearnRateDropFactor',0.1,... % 学习率下降因子 0.1
'LearnRateDropPeriod',35,... % 经过35次训练后 学习率为 0.01*0.1
'Shuffle','every-epoch',... % 每次训练打乱数据集
'ValidationPatience',Inf,... % 关闭验证
'Plots','training-progress',... % 画出曲线
'Verbose',false);
%% 分析网络结构
analyzeNetwork(layers)
%% 训练CNN
net = trainNetwork(p_train,t_train,layers,options);
%% 训练集预测
t_sim1 = predict(net,p_train);
t_sim2 = predict(net,p_test);
%% 反编码
T_sim1 = vec2ind(t_sim1');
T_sim2 = vec2ind(t_sim2');
%% 性能评价
error1 = sum((T_sim1 == T_train))/M * 100 ;
error2 = sum((T_sim2 == T_test))/N * 100 ;
%% 绘图
figure
plot(1:M,T_train,'c*',1:M,T_sim1,'mo','LineWidth',1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'训练集预测结果对比';['准确率=' num2str(error1) '%']};
title(string)
grid
figure
plot(1:N,T_test,'c*',1:N,T_sim2,'mo','LineWidth',1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'测试集预测结果对比';['准确率=' num2str(error2) '%']};
title(string)
grid
%% 绘制混淆矩阵热图
figure
confusionchart(categorical(T_test), categorical(T_sim2));
string={['测试集精度=' num2str(error2) '%']};
title(string)
h= plotconfusion(categorical(T_sim2), categorical(T_test));
title('测试集的混淆矩阵');
% 设置横纵坐标的标签
xlabel('预测输出类别');
ylabel('真实所属类别');
小编在这里列出了程序,有需要的小伙伴可以自取哦~,限于篇幅,数据部分没有列出,有需要的小伙伴可以关注并截图发给小编,我将数据包发给您,谢谢~