‘A2:O317‘);Y_raw = xlsread(‘mat_part1_train.xlsx‘
本文主要介绍BP神经网络的基来源根底理,涉及单隐层神经网络的道理图、BP算法的推导以及附带单隐层BP神经网络的MATLAB源码,适用东西:掌握必然水平的MATLAB根本同时对BP神经网络感兴趣的小白
3 MATLAB源码详解
3.1 数据读取及预措置惩罚惩罚
首先筹备数据,本文中描述的任务是按照学生的春秋、性别等特征来预测最后的数学成效,并将其简化为一个二分类问题,学生特征数据如下
https://files.cnblogs.com/files/yong1/dataset.zip
接下来使用MATLAB读取数据
% 读取训练集数据 X_raw = xlsread(‘mat_part1_train.xlsx‘, ‘A2:O317‘); Y_raw = xlsread(‘mat_part1_train.xlsx‘, ‘P2:P317‘);
本文涉及的神经网络所使用的激活函数为Sigmoid函数,结合该函数的特性,当网络的输入值对照大时,会使得Sigmoid函数陷入饱和区,即神经元的输出值一直为1,因此需要对训练集数据的属性特征值进行归一化措置惩罚惩罚。本文选择线性归一化措置惩罚惩罚函数,即
此外对付二分类任务,需要对网络的输出值进行调解,即输出值为0或者1,因此对原始样本的教师信号进行二值措置惩罚惩罚,最终的数据预措置惩罚惩罚过程如下
function [ X, Y ] = data_preprocessing( X_raw, Y_raw ) %DATA_PREPROCESSING 输入数据归一化措置惩罚惩罚 % 通过线性函数归一化对原始数据进行预措置惩罚惩罚 % X_norm = (X - X_min)/(X_max - X_min) X0 = X_raw; Y0 = Y_raw; % 原始数据 column1 = size(X0,2); % 获取样本的属性个数 array = []; % 存放某一属性值的最大值、最小值 % max0 = max(X0(:,1)) for i=1:column1 extreme(1) = max(X0(:,i)); % 获取第i个属性的最大值 extreme(2) = min(X0(:,i)); % 获取第i个属性的最小值 array = [array; extreme]; end % disp(array) % 线性函数归一化 % X(:,1) = (X0(:,1)-array(1,2)) / (array(1,1)-array(1,2)); for i=1:column1 X(:,i) = (X0(:,i)-array(i,2)) / (array(i,1)-array(i,2)); end % 对样本输出进行二分类措置惩罚惩罚 for i=1:size(Y0,2) for j=1:size(Y0,1) if Y0(j,i)>10 Y(j,i) = 1; % 当样本值>10时,记为第一类,,即 y=1 else Y(j,i) = 0; % 当样本值<10时,记为第二类,即 y=0 end end end end
3.2 网络布局初始化
由于是单隐层神经网络,即网络布局只包孕输入层、隐层和输出层,此中输入层神经元的个数由训练集数据的属性个数(即X_raw的列数)确定,输出层神经元的个数由输出值的个数(即Y_raw的列数)确定,至于隐层神经元的个数便可以视情况而定,一般情况下隐层神经元的个数比输入层神经元多,本文中隐层神经元的个数比输入层多5个,网络布局初始化代码如下
function [ v_init, w_init, gamma_init, theta_init ] = net_initial( d, q, l ) %NET_INITIAL 单隐层BP网络布局初始化 % d:输入神经元的个数 % q:隐层神经元的个数 % l:输出层神经元的个数 global v w gamma theta v = rand(d+1, q); % 输入层--隐层的连接权的随机初始化 w = rand(q+1, l); % 隐层--输出层的连接权的随机初始化 gamma = rand(1, q); % 隐层神经元的阈值 theta = rand(1, l); % 输出层神经元的阈值 v_init = v; w_init = w; gamma_init = gamma; theta_init = theta; % disp(v_init),disp(w_init),disp(gamma_init),disp(theta_init) end
上述代码中在随机初始化输入层--隐层以及隐层--输出层的连接权时,矩阵的维度分袂设置为 (d+1)*q 和 (q+1)*l,这是因为输入层和隐层各有一个偏置信号,可分袂将其看做输入值为1、连接权分袂为ω(d+1)q和ω(q+1)l的神经元,于是便完成网络布局的初始化。
3.3 参数更新
由于训练样本个数较少,因此可以使每个样本都对网络模型进行一次更新,样本的循环更新次数可以通过times变量设置,学习率通过eta变量设置,模型训练部分的代码如下
function [ v_train, w_train, gamma_train, theta_train ] = net_train( X, Y, times, eta ) %NET_TRAIN 训练网络参数 % X:输入样本的属性值,即输入层神经元的输入 % Y:样本的期望输出,即输出层神经元的期望输出 % times:网络的训练次数 % eta:网络的学习率 global v w gamma theta k = size(X,1); % k:样本个数 for time=1:times % 网络的训练轮次 for i=1:k % 遍历所有样本对网络进行训练 x0 = X(i,:); % 获取单个样本的所有属性值 x = [x0 1]; % 为输入层神经元插手偏置 y = Y(i,:); % y:样本的期望输出值 % 前向计算 alpha = x*v; % alpha:隐层神经元的输入 b0 = f_active(alpha, gamma); % b0:隐层神经元的输出/点运算 b = [b0 1]; % 为隐层神经元插手偏置 beta = b*w; % beta:输出层神经元的输入 y_samp = f_active(beta, theta); % y_samp:输出层神经元的输出 % 后向计算/每个样本都对网络参数更新一次 g = y_samp.*(1-y_samp).*(y-y_samp); % 输出层神经元的梯度项 q = size(w,1)-1; % 获取隐层神经元的个数 e = b0.*(1-b0).*(g*w(1:q,:)‘); % 隐层神经元的梯度项 delta_w = eta*b‘*g; % 隐层-输出层的连接权的变革量 delta_thet = -eta*g; % 输出层阈值的变革量 delta_v = eta*x‘*e; % 输入层-隐层的连接权的变革量 delta_gamma = -eta*e; % 隐层阈值的变革量 w = w+delta_w; % 更新隐层-输出层的连接权 theta = theta+delta_thet; % 更新输出层阈值 v = v+delta_v; % 更新输入层-隐层的连接权 gamma = gamma+delta_gamma; % 更新隐层的阈值 v_train = v; w_train = w; gamma_train = gamma; theta_train = theta; % disp(v_train),disp(w_train),disp(gamma_train),disp(theta_train) end end % disp(v_train),disp(w_train),disp(gamma_train),disp(theta_train) end
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31723.html