BP神经网络中输入层到隐含层权重矩阵与输入层隐含层节点不一致
22 views (last 30 days)
Show older comments
BP神经网络中输入层到隐含层权重矩阵与输入层隐含层节点不一致,
输入层神经元设定46个,最佳隐含层为9个,得到权重矩阵是45*9,具体代码与工作区如下,请问是哪里出现了问题
%初始化,清空变量
clear
close all
clc
format short %精确到小数点后4位,format long是精确到小数点后15位
导入数据
data=xlsread("数据集.xlsx",'A2:AZ161');
% 设置神经网络的输入和输出
numRows=size(data,1);%获取数据行数
rowIndices=randperm(numRows);%行数随机排布
data_r=data(rowIndices,:);%行数随机排布打乱数据
input=data_r(1:end,1:end-6); %第1列至倒数第7列为输入
output=data_r(1:end,end-5:end); %最后6列为输出
N=length(input) %计算样本数量
testNum=40 ; %设定测试集样本数量,从数据集后面选取
trainNum=N-testNum ; %设定训练集样本数量
设置训练集和测试集
input_train=input(testNum+1:trainNum+testNum,:)'; % 训练集输入
output_train=output(testNum+1:trainNum+testNum,:)'; % 训练集输出
input_test=input(1:testNum,:)';% 测试集输入
output_test=output(1:testNum,:)'; % 测试集输出
数据归一化
[inputn,inputps]=mapminmax(input_train,0,1); % 训练集输入归一化到[0,1]之间
[outputn,outputps]=mapminmax(output_train); % 训练集输出归一化到默认区间[-1, 1]
inputn_test=mapminmax('apply',input_test,inputps);
最佳隐含层的确定
inputnum=size(input,2); %size用来求取矩阵的行数和列数,1代表行数,2代表列数
outputnum=size(output,2);
disp(['输入层节点数:',num2str(inputnum),', 输出层节点数:',num2str(outputnum)])
disp(['隐含层节点数范围为 ',num2str(fix(sqrt(inputnum+outputnum))+1),' 至 ',num2str(fix(sqrt(inputnum+outputnum))+10)])
disp(' ')
disp('最佳隐含层节点的确定...')
%根据hiddennum=sqrt(m+n)+a,m为输入层节点数,n为输出层节点数,a取值[1,10]之间的整数
MSE=1e+5; %误差初始化
transform_func={'tansig','purelin'}; %激活函数采用tan-sigmoid和purelin
train_func='trainlm'; %训练算法
for hiddennum=fix(sqrt(inputnum+outputnum))+1:fix(sqrt(inputnum+outputnum))+10
net=newff(inputn,outputn,hiddennum,transform_func,train_func); %构建BP网络
% 进行网络训练
net=newff(inputn,outputn,hiddennum);
an0=sim(net,inputn); %仿真结果
mse0=mse(outputn,an0); %仿真的均方误差
disp(['当隐含层节点数为',num2str(hiddennum),'时,训练集均方误差为:',num2str(mse0)])
%不断更新最佳隐含层节点
if mse0<MSE
MSE=mse0;
hiddennum_best=hiddennum;
end
end
disp(['最佳隐含层节点数为:',num2str(hiddennum_best),',均方误差为:',num2str(MSE)])
神经网络构建
w = rand(inputnum, hiddennum_best) - 0.5
net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');
% 网络参数
net.trainParam.epochs=90000; % 训练次数
net.trainParam.lr=0.003; % 学习速率
net.trainParam.goal=0.0001; % 训练目标最小误差
网络训练
[net,tr]=train(net,inputn,outputn); % train函数用于训练神经网络
inputn_test=mapminmax('apply',input_test,inputps);%预测结果归一化
an=sim(net,inputn_test);%预测输出
BPoutput=mapminmax('reverse',an,outputps);%输出结果反归一化
网络预测结果图形
figure(1)
plot(BPoutput,'-*')
hold on
plot(output_test,'-*')
legend('预测输出','期望输出')
title('BP神经网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%网络预测误差图形
error=BPoutput-output_test
figure(2)
plot(error,'-*')
title('BP神经网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
%输入到隐层权值:
w1=net.IW{1}
%隐层阈值:
theta1=net.b{1}
%隐层到输出层权值:
w2=net.lw{2,1}
%输出层阈值:
theta2=net.b{2}
disp(size(inputn))
% 计算所有输入神经元权值的总和
total_weight_sum = sum(sum(abs(w1')));
% 初始化一个向量来存储每个输入神经元的权值和
weight_sums = sum(abs(w1'), 2); % 按列求和,得到每个输入神经元的权值和
% 计算每个输入神经元权值和的占比
weight_percentages = (weight_sums / total_weight_sum) * 100;
% 输出每个输入神经元的权值和及其占比
for j = 1:length(weight_sums)
fprintf('输入层第 %d 个神经元的权值和是: %f, 占比是: %f%%\n', j, weight_sums(j), weight_percentages(j));
end

0 Comments
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!