BP入门学习
1.神经网络是什么
2.BP神经网络基础理论
3.BP神经网络的建模
4.自实现一个BP神经网络
【代码】BP神经网络归一化训练Demo
作者 : 老饼 日期 : 2022-10-23 19:24:58 更新 : 2023-05-08 18:48:55
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com




本文展示如何归一化数据再利用梯度下降算法训练BP神经网络的代码实现

本文旨在简单学习和了解BP神经网络的具体训练的细节




     BP神经网络归一化训练Demo-nbp3    


本文展示三层BP神经网络如何将数据归一化再进行训练(梯度下降法)的代码
 具体如下
function [w21,b2,w32,b3,xmin,xmax,ymin,ymax,mse_record] = nbp3(X,y,hn)
[in_num,sample_num] = size(X);                                               % 输入个数,样本个数
[out_num,~]         = size(y);                                               % 输出个数
lr                  = 0.05;                                                  % 学习率

% 将数据归一化
xmax = max(X,[],2);                                                          % 输入数据的最大值
xmin = min(X,[],2);                                                          % 输入数据的最小值
ymax = max(y,[],2);                                                          % 输出数据的最大值
ymin = min(y,[],2);                                                          % 输出数据的最小值
X  = 2*(X -repmat(xmin,1,size(X,2)))./repmat(xmax-xmin,1,size(X,2)) -1;      % 将输入数据归一化
y  = 2*(y -repmat(ymin,1,size(y,2)))./repmat(ymax-ymin,1,size(y,2)) -1;      % 将输出数据归一化

%--------初始化w,b和预测结果-----------
w32  = rand(out_num,hn);                                                     % 隐层到输出层的权重 
b3   = rand(out_num,1);                                                      % 输出层阈值
w21  = rand(hn,in_num);                                                      % 输入层到隐层权重
b2   = rand(hn,1);                                                           % 隐层阈值
simy = w32*tansig(w21*X+repmat(b2,1,size(X,2)))+repmat(b3,1,size(X,2));      % 预测结果
mse_record = [sum(sum((simy - y ).^2))/(sample_num*out_num)];                % 预测误差记录

% ---------用梯度下降训练------------------
for i = 1:5000
    %计算梯度                                                          
    A2 = tansig(w21*X+repmat(b2,1,sample_num));                              % 隐节点激活值
    dN3     = 2*(simy - y )/(sample_num*out_num);                            % 输出层节点梯度
    dw32   = dN3*A2';                                                        % 隐层-输出层权重梯度
    db3    = sum(dN3,2);                                                     % 输出层阈值梯度
																		     
    dN2     = (w32'*dN3).*(1-A2.^2);                                         % 隐层节点梯度
    dw21   = dN2*X';                                                         % 输入层-隐层权重梯度
    db2    = sum(dN2,2);                                                     % 隐层阈值梯度
																		     
    %往负梯度更新w,b                                                         
    w32    = w32 - lr*dw32;                                                  % 更新隐层-输出层权重 
    b3     = b3  - lr*db3;                                                   % 更新输出层阈值
    w21    = w21 - lr*dw21;                                                  % 更新输入层-隐层权重 
    b2     = b2  - lr*db2;                                                   % 更新隐层阈值
    
    % 计算网络预测结果与记录误差
    simy = w32*tansig(w21*X+repmat(b2,1,size(X,2)))+repmat(b3,1,size(X,2));   % 当前网络的预测值 
    mse_record =[mse_record, sum(sum((simy - y ).^2))/(sample_num*out_num)];  % 记录本次均方误差
end
end
上述代码主要在bp神经网络的训练中加入第6-12行,对数据进行归一化,
并在出参上返回数据归一化所用的最大最小值









 End 





联系老饼