BP神经网络的matlab实现和参数提取以及实现

BP神经网络的训练

%*******************************************************************训练BP
%bp神经网络训练
%bp神经网络的输入和输出都是:竖着排列的
% [num1,num2,num3]=xundata;
%输入两个,中间三个,输出两个,训练共三组
num1=[1 2;
      3 5;
      6 8];
num2=[4 6;
      6 8;
      7 8];
num3=[1 2];
%*****************************************************************************
input_train=num1';%训练输入数据
output_train=num2';%训练输出数据
for i=1:20%增加训练样本
    input_train=[input_train,num1'];
    output_train=[output_train,num2'];
end
input_test=num3';%测试数据
%*****************************************************************************
%样本归一化处理,归一化到[-1,1],inputps,而inputn包含了一些信息
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%隐含层有10个神经元,传递函数是tan-sigmoid
%输出层的传递函数是linear,训练函数是traingd,trainlm,trainlm好像更快点
net=newff(inputn,outputn,3,{'tansig','purelin'},'trainlm');
net.trainParam.epochs=1000;%训练次数
net.trainParam.lr=0.5;%训练速度
net.trainParam.goal=0.0001;%目标误差
net=train(net,inputn,outputn);%训练误差小,而验证误差大很可能是由训练样本少导致的,只有8个,可以增加样本数量,是的,就是这样
%*****************************************************************************
%测试
inputn_test=mapminmax('apply',input_test,inputps);%将测试数据归一化处理
an=sim(net,inputn_test);
BPoutput=mapminmax('reverse',an,outputps);%将测试数据反归一化处理,表示实际输出
BPoutput=round(BPoutput)
%*****************************************************************************
save data net inputps outputps

BP神经网络的测试

%*******************************************************************加载BP
%调用已经训练好的bp神经网络

load data net inputps outputps %加载训练好的神经网络
% input_test=num';
% inputn_test=mapminmax('apply',input_test,inputps);
% an=sim(net,inputn_test);
% testoutput=mapminmax('reverse',an,outputps);
% testoutput=round(testoutput);

BP神经网络的参数

w1=net.iw{1,1};%输入到隐含层的权值
theta1=net.b{1};%输入到隐含层的阈值
w2=net.lw{2,1};%输入到输出层的权值
theta2=net.b{2};%输入到输出层的阈值
%对于权值,列为不同输入的,行为要传到的层
w1
theta1
w2
theta2

BP神经网络的实现

%**************************测试
%测试数据
indata=[6,8];
%归一化,需要对每个输入的通道,按照其通道的最大值最小值进行归一化
indata_gui(1)=2*(indata(1)-1)/5.0-1;
indata_gui(2)=2*(indata(2)-2)/6.0-1;
%参数设置
hid_num=3;
x_num=2;
y_num=2;
%隐含层计算,里面算的是输入的挨个计算,外面的控制的是隐含层
for k=1:hid_num
    data=0;
    for i=1:x_num
        data=data+w1(k,i)*indata_gui(i);
    end
    data=data+theta1(k);
    hid_data(k)=2.0/(1+exp(-2*data))-1;
end
%输出层计算
for i=1:y_num
    data=0;
    for k=1:hid_num
        data=data+hid_data(k)*w2(i,k);
    end
    data=data+theta2(i);
    y_data(i)=data;
end
%为反归一化,也是针对每个输出通道的
out1=(y_data(1)+1)/2.0*3+4;
out2=(y_data(2)+1)/2.0*2+6;
out1
out2
  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值