Halcom 发表于 2017-5-22 22:02:24

BP神经网络底层代码详解

百度网盘链接:
链接:http://pan.baidu.com/s/1bV4asu
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

BP神经网络底层代码详解:
clc,clear,close all   % 清理命令区、清理工作区、关闭显示图形
warning off         % 消除警告
feature jit off       % 加速代码运行
format short      % 数据类型
tic               % 运算计时
load('data.mat')
xs = data(1:3,:)';% 输入数据
ys = data(4,:)';    % 输出数据
% 选连样本输入输出数据归一化
xsmin = min(xs);   
xsmax = max(xs);
for i=1:length(xsmin)
    xs(:,i) = (xs(:,i)-xsmin(i))./(xsmax(i)-xsmin(i));
end
% 拟合计算
hiddennum = 10;   % 隐藏层个数
itermax = 4000;   % 迭代计算次数
% 节点个数
inputnum=3;   % 自变量个数
outputnum=1;% 因变量个数

xite=0.1;   % 学习因子
alfa1=0.5;   % 动量系数

% 输入层到隐藏层 权值
w1 = 10*rands(inputnum,hiddennum);   
w1_1=w1;   
w1_2=w1;   
% 隐藏层到输出层 权值
w2 = 10*rands(hiddennum,outputnum);
w2_1=w2;   
w2_2=w2;

I=zeros(hiddennum,1);    % 输入层到隐藏层 计算值
Iout=zeros(hiddennum,1); % 隐藏层到输出层 计算值
FI=zeros(hiddennum,1);   % S函数的导数f(x) = 1/(1+exp(-x)),则导数f(x)' = f(x)*(1-f(x))

NS=size(xs,1);% 训练数据维数,样本个数

for ii=1:itermax
    for s=1:NS   % 逐行提取样本
      % 输入层到隐藏层
      x=xs(s,:);   % 逐行提取样本
      for j=1:hiddennum   
            I(j)=x*w1(:,j);
            Iout(j)=1/(1+exp(-I(j)));
      end
      % 隐藏层到输出层
      yl=w2'*Iout;
      
      y=ys(s,:);% 实际值、
      ey=y-yl;            % 误差
      el = 0.5*( ey )^2;    % 输出误差性能指标
      es(s)=el;
      
      if s==NS
         E = sum(es);    % 误差累计和
      end
      
      % 隐藏层到输出层的更新
      w2=w2_1+xite*Iout*ey+alfa1*(w2_1-w2_2);
      
      % 输入层到隐藏层的更新
      for j=1:hiddennum
         S=1/(1+exp(-I(j)));
         FI(j)=S*(1-S);
      end
      for i=1:inputnum
         for j=1:hiddennum
               dw1(i,j)=xite*FI(j)*x(i)*(ey(1)*w2(j,1));
         end
      end
      w1=w1_1+dw1+alfa1*(w1_1-w1_2);
      
      w1_2=w1_1; w1_1=w1;
      w2_2=w2_1; w2_1=w2;
    end
    Ek(ii)=E;   % 每一次的迭代误差
end
time = toc   % 计时结束
%% 画图
figure(1);
% plot(Ek,'ro-');
loglog(Ek,'ro-')
xlabel('迭代次数');ylabel('迭代误差E');axis tight;grid on;
%% 数据拟合画图
test = xs;
for i=1:size(test,1)% 样本个数
      for j=1:hiddennum   
      I_test(i,j)=test(i,:)*w1(:,j);
      Iout_test(i,j)=1/(1+exp(-I_test(i,j)));
      end
end
y=w2'*Iout_test';
disp(['预测值: '])
disp( num2str(y') )

disp(['预测结果的均方根误差: ', num2str(mse(y'-ys) ) ])

figure(2),hold on;
plot(y,'r.-');
plot(ys,'b.-');
legend('拟合预测数据','实际数据');
grid on;axis tight;
hold off;
案例分享:【1】BP神经网络模糊评价
【2】BP 神经网络训练

页: [1]
查看完整版本: BP神经网络底层代码详解