【MATLAB第46期】基于MATLAB的改进模糊卷积神经网络IFCNN多分类预测模型
一、展示效果
二、思路
在正常CNN卷积神经网络训练阶段之后,使用进化算法(蜜蜂算法)拟合深度学习权重和偏差。
本文案例数据中, 用深度模型进行4分类预测。
先在 CNN 训练之后,为每个类别权重创建初始模糊模型
然后提取全连接层的权重进行进化寻优,并替换初始权重
最后,优化后的权重(来自全连接层)建立模型。
数据情况:
%% 导入数据 res = xlsread('数据集.xlsx'); %% 划分训练集和测试集 temp = randperm(357); P_train = res(temp(1: 240), 1: 12)'; T_train = res(temp(1: 240), 13)'; M = size(P_train, 2); P_test = res(temp(241: end), 1: 12)'; T_test = res(temp(241: end), 13)'; N = size(P_test, 2); %% 数据归一化 [P_train, ps_input] = mapminmax(P_train, 0, 1); P_test = mapminmax('apply', P_test, ps_input); t_train = categorical(T_train)'; t_test = categorical(T_test )'; %% 数据平铺 % 将数据平铺成1维数据只是一种处理方式 % 也可以平铺成2维数据,以及3维数据,需要修改对应模型结构 % 但是应该始终和输入层数据结构保持一致 p_train = double(reshape(P_train, 12, 1, 1, M)); p_test = double(reshape(P_test , 12, 1, 1, N));
三、CNN结构参数
%% 构造网络结构 layers = [ imageInputLayer([12, 1, 1]) % 输入层 convolution2dLayer([2, 1], 16) % 卷积核大小为2*1 生成16个卷积 batchNormalizationLayer % 批归一化层 reluLayer % relu激活层 maxPooling2dLayer([2, 1], 'Stride', 1) % 最大池化层 大小为2*1 步长为2 convolution2dLayer([2, 1], 32) % 卷积核大小为2*1 生成32个卷积 batchNormalizationLayer % 批归一化层 reluLayer % relu激活层 maxPooling2dLayer([2, 1], 'Stride', 1) % 最大池化层,大小为2*2,步长为2 fullyConnectedLayer(4) % 全连接层(类别数) softmaxLayer % 损失函数层 classificationLayer]; % 分类层 %% 参数设置 options = trainingOptions('adam', ... % Adam 梯度下降算法 'MaxEpochs', 500, ... % 最大训练次数 500 'InitialLearnRate', 1e-3, ... % 初始学习率为0.001 'L2Regularization', 1e-04, ... % L2正则化参数 'LearnRateSchedule', 'piecewise', ... % 学习率下降 'LearnRateDropFactor', 0.5, ... % 学习率下降因子 0.1 'LearnRateDropPeriod', 450, ... % 经过450次训练后 学习率为 0.001 * 0.5 'Shuffle', 'every-epoch', ... % 每次训练打乱数据集 'ValidationPatience', Inf, ... % 关闭验证 'Plots', 'none', ... % 画出曲线 'Verbose', 1);
四、IFCNN结构参数
Params.MaxIt=20;%进化算法迭代次数 Params.nScoutBee = 10;%进化算法种群数量 % 训练模型 [net,info] = trainNetwork(p_train, t_train, layers, options); % 提取全连接层的权重进行进化 FullConn=netobj.Layers(10, 1).Weights; netbias=netobj.Layers(10, 1).Bias; %% 为每个类权重制作基本模糊模型 % 模糊 C 均值 (FCM) 簇数 ClusNum=3; % 为每个类别权重创建初始模糊模型 for i=1:sizefinal fism{i}=GenerateFuzzy(datam{i},ClusNum); end %% 训练输出提取 for i=1:sizefinal TrTar{i}=datam{i}.TrainTargets; TrInp{i}=datam{i}.TrainInputs; TrainOutputs{i}=evalfis(TrInp{i},BeesFISm{i}); end; % 将输出单元格转换为矩阵 for i=1:sizefinal EvolvedFullConn(i,:)=TrainOutputs{i}'; end; %% 替换进化的权重 netobj.Layers(10, 1).Weights=EvolvedFullConn; % 新网络 net2=netobj.Layers;
五、代码获取
后台私信回复“45期”获取下载链接。