本站原创文章,转载请说明来自《老饼讲解-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