BP神经网络中输入层​到隐含层权重矩阵与输​入层隐含层节点不一致

22 views (last 30 days)
家豪 王
家豪 王 on 29 Apr 2024
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

Answers (0)

Categories

Find more on 数学 in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!