MATLAB神经网络(1) BP神经网络的数据分类——语音特征信号分类
1.1 案例背景
1.1.1 BP神经网络概述
BP神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播。在前向传递中,输入信号从输入层经隐含层逐层处理,直至输出层。每一层的神经元状态只影响下一层神经元状态。如果输出层得不到期望输出,则转入反向传播,根据预测误差调整网络权值和阔值,从而使BP神经网络预测输出不断逼近期望输出。
当输入节点数为$n$、输出节点数为$m$时, BP 神经网络就表达了从$n$个自变量到$m$个因变量的函数映射关系。
BP 神经网络预测前首先要训练网络,通过训练使网络具有联想记忆和预测能力。 BP神经网络的训练过程包括以下几个步骤:
- 网络初始化:根据系统输入输出序列($X$,$Y$)确定网络输入层节点数$n$、隐含层节点数$l$,输出层节点数$m$,初始化输入层、隐含层和输出层神经元之间的连接权值$\omega_{ij}$、$\omega_{jk}$,初始化隐含层阈值$a$、输出层阈值$b$,给定学习速率和神经元激励函数。
- 隐含层输出计算:根据输入变量$X$,输入层和隐含层间连接权值$\omega_{ij}$以及隐含层阁值$a$,计算隐含层输出$H$。\[{H_j} = f\left( {\sum\limits_{i = 1}^n {{\omega _{ij}}{x_i} - {a_j}} } \right){\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} j = 1,2, \ldots ,l\]式中,$l$为隐含层节点数,$f$为隐含层激励函数,该函数有多种表达形式,此处所选函数为\[f(x) = \frac{1}{{1 + {e^{ - x}}}}\]
- 输出层输出计算。根据隐含层输出$H$,连接权值$\omega_{jk}$和阔值$b$,计算BP神经网络预测输出$O$。\[{O_k} = \sum\limits_{j = 1}^l {{H_j}{\omega _{jk}} - {b_k}} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} k = 1,2, \ldots ,m\]
- 误差计算:根据网络预测输出$O$和期望输出$Y$,计算网络预测误差$e$。\[{e_k} = {Y_k} - {O_k}\]
- 权值更新:根据网络预测误差$e$更新网络连接权值$\omega_{ij}$、$\omega_{jk}$。\[\begin{array}{l} {\omega _{ij}} = {\omega _{ij}} + \eta {H_j}(1 - {H_j})x(i)\sum\limits_{k = 1}^m {{\omega _{jk}}{e_k}} \\ {\omega _{jk}} = {\omega _{jk}} + \eta {H_j}{e_k}{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} i = 1,2, \ldots ,n;j = 1,2, \ldots ,l;k = 1,2, \ldots ,m \end{array}\]式中,$\eta$为学习速率。
- 阈值更新:根据网络预测误差$e$更新网络节点阔值$a$、$b$。\[\begin{array}{l} {a_j} = {a_j} + \eta {H_j}(1 - {H_j})\sum\limits_{k = 1}^m {{\omega _{jk}}{e_k}} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} j = 1,2, \ldots ,l\\ {b_k} = {b_k} + \eta {e_k}{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} k = 1,2, \ldots ,m \end{array}\]
- 判断算法迭代是否结束,若没有结束,返回步骤2。
1.1.2 语音特征信号识别
语音特征信号识别是语音识别研究领域中的一个重要方面,一般采用模式匹配的原理解决。语音识别的运算过程为:首先,待识别语音转化为电信号后输入识别系统,经过预处理后用数学方法提取语音特征信号,提取出的语音特征信号可以看成该段语音的模式;然后,将该段语音模型同已知参考模式相比较,获得最佳匹配的参考模式为该段语音的识别结果。
1.2 模型建立
民歌、古筝、摇滚、流行
倒谱系数法:500组24维语音特性信号
subplot(4,1,1) plot(c1) ylabel("民歌"); title("语音特征信号"); subplot(4,1,2) plot(c2) ylabel("古筝"); subplot(4,1,3) plot(c3) ylabel("摇滚"); subplot(4,1,4) plot(c4) xlabel("语音帧"); ylabel("流行");
神经网络结构:24-25-4
![](https://img2018.cnblogs.com/i-beta/1752446/202002/1752446-20200217152034998-614158989.png)
1.3 MATLAB实现
1.3.1 归一化方法
- mapminmax:Processes matrices by normalizing the minimum and maximum values of each row to [YMIN,YMAX], [-1, 1] by default.
- [Y,PS] = mapminmax(X,YMIN,YMAX)
- [Y,PS] = mapminmax(X,FP)
- Y = mapminmax('apply',X,PS)
- X = mapminmax('reverse',Y,PS)
- dx_dy = mapminmax('dx_dy',X,Y,PS)
PS: Process settings that allow consistent processing of values.
1.3.2 数据选择和归一化
%% 基于BP网络的语言识别 %% 清空环境变量 clc clear %% 训练数据预测数据提取及归一化 %加载四类语音信号 load('data1.mat') load('data2.mat') load('data3.mat') load('data4.mat') %四个特征信号矩阵合成一个矩阵 data(1:500,:)=c1(1:500,:); data(501:1000,:)=c2(1:500,:); data(1001:1500,:)=c3(1:500,:); data(1501:2000,:)=c4(1:500,:); size(data)
%从1到2000间随机排序 k=rand(1,2000); [m,n]=sort(k);
[B,I] = sort(A) sorts the elements of A in ascending order. I is the same size as A and describes the arrangement of the elements of A into B along the sorted dimension. For example, if A is a vector, then B = A(I).
%输入输出数据 input=data(:,2:25); output1 =data(:,1); %把输出从1维变成4维 output=zeros(2000,4); for i=1:2000 switch output1(i) case 1 output(i,:)=[1 0 0 0]; case 2 output(i,:)=[0 1 0 0]; case 3 output(i,:)=[0 0 1 0]; case 4 output(i,:)=[0 0 0 1]; end end %随机提取1500个样本为训练样本,500个样本为预测样本 input_train=input(n(1:1500),:)'; output_train=output(n(1:1500),:)'; input_test=input(n(1501:2000),:)'; output_test=output(n(1501:2000),:)'; %输入数据归一化 [inputn,inputps]=mapminmax(input_train);
1.3.3 BP神经网络结构初始化
%% 网络结构初始化 innum=24; midnum=25; outnum=4; %权值初始化 w1=rands(midnum,innum); b1=rands(midnum,1); w2=rands(midnum,outnum); b2=rands(outnum,1); %学习率 xite=0.1; %学习速率 loopNumber=10; %循环次数 I=zeros(1,midnum); Iout=zeros(1,midnum); FI=zeros(1,midnum); dw1=zeros(innum,midnum); db1=zeros(1,midnum);
1.3.4 BP神经网络训练
%% 网络训练 E=zeros(1,loopNumber); for ii=1:loopNumber for i=1:1:1500 %% 网络预测输出 x=inputn(:,i); % 隐含层输出 for j=1:1:midnum I(j)=inputn(:,i)'*w1(j,:)'+b1(j); %矩阵乘法,inputn是n×1500,w1是l×n %inputn(:,i)'是1×n,w1(j,:)'是n×1 Iout(j)=1/(1+exp(-I(j))); %Iout是1×l end % 输出层输出 yn=w2'*Iout'+b2; %矩阵乘法,w2是l×m,Iout是1×l %w2'是m×l,Iout'是l×1,yn是m×1 %% 权值阀值修正 %计算误差 e=output_train(:,i)-yn; E(ii)=E(ii)+sum(abs(e)); %计算权值变化率 dw2=e*Iout; %m×l db2=e'; for j=1:1:midnum S=1/(1+exp(-I(j))); FI(j)=S*(1-S); end for k=1:1:innum for j=1:1:midnum dw1(k,j)=FI(j)*x(k)*sum(e'*w2(j,:)'); db1(j)=FI(j)*sum(e'*w2(j,:)'); end end w1=w1+xite*dw1'; b1=b1+xite*db1'; w2=w2+xite*dw2'; b2=b2+xite*db2'; end end
1.3.5 BP神经网络分类
%% 语音特征信号分类 inputn_test=mapminmax('apply',input_test,inputps); fore=zeros(4,500); for ii=1:1 for i=1:500%1500 %隐含层输出 for j=1:1:midnum I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end fore(:,i)=w2'*Iout'+b2; end end
1.3.6 结果分析
%% 结果分析 %根据网络输出找出数据属于哪类 output_fore=zeros(1,500); for i=1:500 output_fore(i)=find(fore(:,i)==max(fore(:,i))); end %BP网络预测误差 error=output_fore-output1(n(1501:2000))'; %画出预测语音种类和实际语音种类的分类图 figure(1) plot(output_fore,'r') hold on plot(output1(n(1501:2000))','b') legend('预测语音类别','实际语音类别')
![](https://img2018.cnblogs.com/i-beta/1752446/202002/1752446-20200217161554805-71975384.png)
%画出误差图 figure(2) plot(error) title('BP网络分类误差','fontsize',12) xlabel('语音信号','fontsize',12) ylabel('分类误差','fontsize',12)
[tbl,chi2,p] = crosstab(x1,x2,...,xn) returns a multi-dimensional cross-tabulation, tbl, of data for multiple input vectors, x1, x2, ..., xn, and also the chi-square statistic, chi2, and itsp-value, p, for a test that tbl is independent in each dimension.
[tbl,chi2,p]=crosstab(output_fore,output1(n(1501:2000))')
%正确率 rightridio=zeros(1,4); ss=sum(tbl); for i=1:4 rightridio(i)=tbl(i,i)./ss(i); end disp(rightridio);
plot(E)
上图展现了10次迭代过程中,总误差绝对值之和的变化趋势。
1.4 扩展
1.4.1 隐含层节点数
参考公式:
\[\begin{array}{l}
l < n - 1\\
l < \sqrt {m + n} + a\\
l = {\log _2}n
\end{array}\]
$a$为0到10之间的常数。
1.4.2 附加动量方法
BP 神经网络的采用梯度修正法作为权值和阔值的学习算法,从网络预测误差的负梯度方向修正权值和阔值,没有考虑以前经验的积累,学习过程收敛缓慢。对于这个问题,可以采用附加动量方法来解决,带附加动量的权值学习公式为\[\omega (k) = \omega (k - 1) + {\eta _1}\Delta \omega (k) + {\eta _2}[\omega (k - 1) - \omega (k - 2)]\]式中${\eta _1}$、${\eta_2}$为学习率。
1.4.3 变学习率学习算法
BP神经网络学习率的取值在[0,1]之间,学习率越大,对权值的修改越大,网络学习速度越快。但过大的学习速率将使权值学习过程产生震荡,过小的学习率使网络收敛过慢,权值难以趋于稳定。变学习率方法是指学习率在BP神经网络进化初期较大,网络收敛迅速,随着学习过程的进行,学习率不断减小,网络趋于稳定.变学习率计算公式为\[\eta (t) = {\eta _{\max }} - t({\eta _{\max }} - {\eta _{\min }})/{t_{\max }}\]式中$\eta_{max}$为最大学习率,$\eta_{min}$为最小学习率,$t_{max}$为最大迭代次数,$t$为当前迭代次数。