利用遗传算法优化神经网(GA-BP)过程中,按很多教程里的介绍描述,一般的做法就是通过遗传算法,从随机矩阵开始,逐步找到合适的初始化权重阈值矩阵。

如果是新手自己搭建,特别是利用matlab的神经网络工具箱-导出脚本这种方式想自己上改动时,经常会面临一个问题——我在哪改权重和阈值????

首先我们来看默认的神经网络工具箱会导出什么样的脚本。

1. 默认的神经网络工具箱与默认的代码

新版的神经网络工具箱神经拟合就长这个样子(本人使用的是R2022a)

目前就个人的理解而言,如果在这个基础上搭建或改造,那么你的网络只会有三层

1. 输入层(如图所示是393个输入)(输入的时候,必须不同行是不同特征,不同列是不同样本,不过这个工具箱会给你转置的机会)

2. 隐藏神经层(只有一层,只有一层!工具箱默认这是一层10个神经元)

3. 输出层(如图所示是9个输出)

如果直接使用,那么在这一阶段能够调整的,只有左上角的3个值,划分验证测试集比例和定义层大小(也就是层神经元的个数,而不是层的个数),别的什么也调不了

bp神经网络和神经网络区别 bp神经网络结果不一样_matlab

 点击运行后,会这样显示,可以看见很多地方都是用了默认值,比如目标最大轮数,MU,梯度,验证检查等,似乎都不允许你设定的样子:

bp神经网络和神经网络区别 bp神经网络结果不一样_权重_02

 结束的时候,你也会发现它还有很多其他的默认值,比如算法,数据划分,性能,你也找不到地方设定,不知道它怎么就是这样的。不过右上角有一个导出代码,似乎有希望。

bp神经网络和神经网络区别 bp神经网络结果不一样_深度学习_03

 你选择了综合训练脚本包括部署

bp神经网络和神经网络区别 bp神经网络结果不一样_深度学习_04

 结果发现明面上的数据划分方式(divedeFcn)、训练方式(trainlm)、目标函数(performFcn)是可以在脚本上修改的,但另外有些东西似乎还是找不到修改的入口,你陷入了迷茫

bp神经网络和神经网络区别 bp神经网络结果不一样_神经网络_05

 

2.额外的修改与固定的结果

要想获得固定的结果,必须要有以下四个部分设定是固定的,且在脚本中用额外添加的四部分语句设置好

参考给BP神经网络设置初始权重(matlab)_bp神经网络初始权值_老饼讲解 

1. iw权重——即输入层到神经元的权重

2. b阈值——即中间隐藏层和输出层的阈值

3. lw权重——神经元到输入层的权重

4. 数据划分方式——不能随机划分训练集和测试集,必须要固定下来

设置方法为

1.iw权重,b阈值和lw

inpuno=393;%输入特征为393个
layerno=10; %隐藏层神经元个数为10
outno=9 %输出层特征为9个


%关键:定义输入-隐藏的初始权重iw
iw=cell(2,1); %iw是2行1列的数组,每行分别代表着1-2,2-3层之间的权重
iw{1,1}=iwmatrix; %输入-隐藏权重,iwmatrix为你自己想设置的10*393矩阵
iw{2,1}=[]; %第二行空着就行
net.iw=iw;  %赋值,很关键

%定义隐藏、输出初始阈值b;
b=cell(2,1); %iw是2行1列的数组,每行分别代表着1-2,2-3层之间的阈值
b{1,1}=yuzhi1; %yuzhi1 是你自己想设置的10行1列矩阵
b{2,1}=yuzhi2; %yuzhi1 是你自己想设置的9行1列矩阵
net.b=b; %赋值,很关键

%定义隐藏层-输出层初始权重lw
lw=cell(2,2); %iw是2行2列的数组,目前还没太明白为什么是2行2列
lw{2,1}=lwmat;  %但是这个值一定是在数组的第2行第1列,lwmat为 你自己想设置的9行10列矩阵
net.lw=lw; %赋值,很关键

2. 数据划分方式

net.divideFcn = 'dividerint';

 除了divedint,通过help nndivision,也可以看到其他的设置选项

bp神经网络和神经网络区别 bp神经网络结果不一样_神经网络_06

 除了divederand,其他选项应该都是固定的划分方式。

以上这些对网络设置的代码,都要写在'net'第一次出现之后(也就是初始建立网络之后),train函数之前

%选择用于训练的方法,其他可选的方法选项通过 help nntrain查看
trainFcn = 'trainscg';  % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
%;
hiddenLayerSize = nolay;

%看!net变量第一次出现了!
net = fitnet(hiddenLayerSize,trainFcn);


% Choose Input and Output Pre/Post-Processing Functions
% For a list of all processing functions type: help nnprocess
net.input.processFcns = {'removeconstantrows','mapminmax'};
net.output.processFcns = {'removeconstantrows','mapminmax'};

% Setup Division of Data for Training, Validation, Testing
% For a list of all data division functions type: help nndivision
net.divideFcn = 'divideint';  % Divide data randomly
net.divideMode = 'sample';  % Divide up every sample
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
net.trainParam.max_fail=15;  %定义连续15次没有变好为停止条件

%关键:定义初始权重
iw=cell(2,1);
iw{1,1}=iwmatrix;
iw{2,1}=[];
net.iw=iw;
%定义初始阈值;
b=cell(2,1);
b{1,1}=yuzhi1;
b{2,1}=yuzhi2;
net.b=b;
%定义lw
lw=cell(2,2);
lw{2,1}=lwmat;
net.lw=lw;


%关闭状态弹窗,以节省训练时间
net.trainParam.showWindow = false;

% 开始进行网络训练Train the Network
%看!train函数出现了!
[net,tr] = train(net,xx,tt);

大概就是这样