BP神经网络对音频分类

今天开始学习了BP神经网络,接下来梳理一下今天的内容。今天的知识是建立在区分几种音频信号的基础上。

BP神经网络是一层前馈神经网络,主要特点是信号的前向传递,误差反向传播。

在前向的传播过程中输入信号经过隐含层逐层的处理,直接到输出层,每一层的神经元只影响下一层的神经元状态,如果输出层得不到期望的输出,就会进入反向传播。根据预测误差调整网络权值与阀值。从而使得预测输出不断的逼近期望输出。依我的感觉就是像反馈网络一般,依靠误差来进行调节。如下图为算法的流程图:



对于这个案例的算法流程是


在matlab编程实现过程中,有这么几个重要点的函数:

1.size();在看代码的时候要是不是的用这个函数来检验一下你数据的是几行几列的

2.mapminmax();这个是求归一化和反归一化的函数,具体的使用方法请见 help maxminmax;

3.rand()与rands();这两个函数主要是产生随机数,区别就是前者是产生0到1的随机数,后者是产生-1到1的随机数。然后在结合sort()函数产生随机数。


接下来的这段代码是我经过注释的:

/code

%% 清空环境变量
clc
clear
%% 训练数据预测数据提取及归一化


%下载四类语音信号
load data1 c1
load data2 c2
load data3 c3
load data4 c4


%四个特征信号矩阵合成一个矩阵
data(1:500,:)=c1(1:500,:);
data(501:1000,:)=c2(1:500,:);
data(1001:1500,:)=c3(1:500,:);
data(1501:2000,:)=c4(1:500,:);


%从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k);   %产生随机数组,n是1到2000的随机数组   1*2000


%输入输出数据
input=data(:,2:25);       %取数据的第2到25列    2000*24
output1 =data(:,1);       %取出数据的标签       2000*1


%把输出从1维变成4维
for i=1:2000
    switch output1(i)         %把2000个随机数按照标签进行分类
        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
%output 分为了2000*4的矩阵
%随机提取1500个样本为训练样本,500个样本为预测样本
input_train=input(n(1:1500),:)';     %随机的1500行数据    1500*24‘
output_train=output(n(1:1500),:)';   %随机的1500个标签    1500*4’
input_test=input(n(1501:2000),:)';   %随机的500行数据     500*24‘
output_test=output(n(1501:2000),:)' ;%随机的500行数据    500*4’


%输入数据归一化
[inputn,inputps]=mapminmax(input_train);   %inputn  是1500*24rand的矩阵


%% 网络结构初始化    输入层、隐含层、输出层
innum=24;            
midnum=25;
outnum=4;
 


%权值初始化
w1=rands(midnum,innum);            %25*24
b1=rands(midnum,1);                %25*1
w2=rands(midnum,outnum);           %25*4
b2=rands(outnum,1);                %4*1


w2_1=w2;w2_2=w2_1;
w1_1=w1;w1_2=w1_1;
b1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;


%学习率
xite=0.1
alfa=0.01;           %在增加动力的时候要用的参数,使得学习速度更快


%% 网络训练
for ii=1:10           %训练了10次
    E(ii)=0;
    for i=1:1:1500
       %% 网络预测输出 
        x=inputn(:,i);          %取出第一组    24*1
        % 隐含层输出
        for j=1:1:midnum         %1~25
            I(j)=inputn(:,i)'*w1(j,:)'+b1(j);   %(1*24)*(24*1)*b1
            Iout(j)=1/(1+exp(-I(j)));           %带入函数公式1*25 Iout     
        end
        % 输出层输出
        yn=w2'*Iout'+b2;             %(4*25)*(25*1)+(4*1)
        
       %% 权值阀值修正
        %计算误差
        e=output_train(:,i)-yn;     %4*1500取一个4*1
        E(ii)=E(ii)+sum(abs(e));
        
        %计算权值变化率
        dw2=e*Iout;
        db2=e';
        
        for j=1:1:midnum
            S=1/(1+exp(-I(j)));
            FI(j)=S*(1-S);             %【Hj-(1-Hj)】
        end      
        for k=1:1:innum
            for j=1:1:midnum
                dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
                db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
            end
        end
           
        w1=w1_1+xite*dw1';
        b1=b1_1+xite*db1';
        w2=w2_1+xite*dw2';
        b2=b2_1+xite*db2';
        
        w1_2=w1_1;w1_1=w1;
        w2_2=w2_1;w2_1=w2;
        b1_2=b1_1;b1_1=b1;
        b2_2=b2_1;b2_1=b2;             %%以上的对应公式来看
    end
end
 


%% 语音特征信号分类
inputn_test=mapminmax('apply',input_test,inputps);


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


%预测的输出


%% 结果分析
%根据网络输出找出数据属于哪类
for i=1:500
    output_fore(i)=find(fore(:,i)==max(fore(:,i)));%max(fore(:,i))表示在i列中的最大值. 
%fore(:,i)==max(fore(:,i))表示用fore(:,i)这个outnum×1的矩阵中的每一个值与这一列中的最大值相比,
%相等则为真,记作1,不相等则为假,记作0,所以fore(:,i)==max(fore(:,i))是一个outnum×1矩阵 
%find的作用,在这里是返回非0值在矩阵中所在的位置 
%output_fore是一个1×500的矩阵
end


%BP网络预测误差
error=output_fore-output1(n(1501:2000))';






%画出预测语音种类和实际语音种类的分类图
figure(1)
plot(output_fore,'r')
hold on
plot(output1(n(1501:2000))','b')
legend('预测语音类别','实际语音类别')


%画出误差图
figure(2)
plot(error)
title('BP网络分类误差','fontsize',12)
xlabel('语音信号','fontsize',12)
ylabel('分类误差','fontsize',12)


%print -dtiff -r600 1-4


k=zeros(1,4);  
%找出判断错误的分类属于哪一类
for i=1:500
    if error(i)~=0             %~=表示不等于
        [b,c]=max(output_test(:,i));   %表示output_test的第i列中的最大值和所在位置,b为最大值,c为所在位置
        switch c
            case 1 
                k(1)=k(1)+1;
            case 2 
                k(2)=k(2)+1;
            case 3 
                k(3)=k(3)+1;
            case 4 
                k(4)=k(4)+1;
        end
    end
end


%找出每类的个体和
kk=zeros(1,4);
for i=1:500
    [b,c]=max(output_test(:,i));
    switch c
        case 1
            kk(1)=kk(1)+1;
        case 2
            kk(2)=kk(2)+1;
        case 3
            kk(3)=kk(3)+1;
        case 4
            kk(4)=kk(4)+1;
    end
end


%正确率
rightridio=(kk-k)./kk

/code

在调试的时候要经常的注释掉一点东西,可以使用这样的句子,

%{

。。。

%}


使用加强动力的的代码,是之切换上述的代码:

        w1=w1_1+xite*dw1'+alfa*(w1_1-w1_2);
        b1=b1_1+xite*db1'+alfa*(b1_1-b1_2);
        w2=w2_1+xite*dw2'+alfa*(w2_1-w2_2);
        b2=b2_1+xite*db2'+alfa*(b2_1-b2_2);

使用增强的图形是:

采用不同的隐含层节点数 的数据分析

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7


----------------------------------------
训练10次
rightridio =


    0.4031    1.0000    0.9912    0.8837
----------------------------------------
训练20次
rightridio =


    0.9225    1.0000    0.5468    0.9204
-----------------------------------------
训练5次
rightridio =


    0.9917    1.0000    0.1544    0.9444
-----------------------------------------
隐含层的选取数15到30的数据


rightridio =


    0.6048    0.9921    0.9397    0.8657




ans =


    0.8506




rightridio =


    0.4435    1.0000    0.9397    0.8806




ans =


    0.8160




rightridio =


    0.6210    1.0000    0.8362    0.9179




ans =


    0.8438




rightridio =


    0.5968    1.0000    0.8707    0.8209




ans =


    0.8221




rightridio =


    0.7016    1.0000    0.8534    0.8657




ans =


    0.8552




rightridio =


    0.5323    1.0000    0.8793    0.8284




ans =


    0.8100




rightridio =


    0.7097    1.0000    0.6638    0.8731




ans =


    0.8117




rightridio =


    0.6290    1.0000    0.7845    0.8582




ans =


    0.8179




rightridio =


    0.6210    1.0000    0.8534    0.8358




ans =


    0.8276




rightridio =


    0.6129    1.0000    0.7931    0.8657




ans =


    0.8179




rightridio =


    0.6290    1.0000    0.8276    0.9403




ans =


    0.8492




rightridio =


    0.7419    1.0000    0.7845    0.8955




ans =


    0.8555




rightridio =


    0.6371    1.0000    0.9138    0.8582




ans =


    0.8523




rightridio =


    0.7419    0.9921    0.7414    0.8731




ans =


    0.8371




rightridio =


    0.7500    1.0000    0.8534    0.9104




ans =


    0.8785




rightridio =


    0.7016    1.0000    0.8879    0.8657




ans =
    0.8638


-------------------------------------------
增加训练动力后的


rightridio =


    0.4583    1.0000    0.9220    0.8649


数据显示

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

程序是用for循环写的

%% 清空环境变量
clc
clear
%% 训练数据预测数据提取及归一化


%下载四类语音信号
load data1 c1
load data2 c2
load data3 c3
load data4 c4


%四个特征信号矩阵合成一个矩阵
data(1:500,:)=c1(1:500,:);
data(501:1000,:)=c2(1:500,:);
data(1001:1500,:)=c3(1:500,:);
data(1501:2000,:)=c4(1:500,:);


%从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k);   %产生随机数组,n是1到2000的随机数组   1*2000


%输入输出数据
input=data(:,2:25);       %取数据的第2到25列    2000*24
output1 =data(:,1);       %取出数据的标签       2000*1


%把输出从1维变成4维
for i=1:2000
    switch output1(i)         %把2000个随机数按照标签进行分类
        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
%output 分为了2000*4的矩阵
%随机提取1500个样本为训练样本,500个样本为预测样本
input_train=input(n(1:1500),:)';     %随机的1500行数据    1500*24‘
output_train=output(n(1:1500),:)';   %随机的1500个标签    1500*4’
input_test=input(n(1501:2000),:)';   %随机的500行数据     500*24‘
output_test=output(n(1501:2000),:)' ;%随机的500行数据    500*4’


%输入数据归一化
[inputn,inputps]=mapminmax(input_train);   %inputn  是1500*24rand的矩阵
kkk=zeros(1,16);                        %%%临时更改
%% 网络结构初始化    输入层、隐含层、输出层
for midnum=15:1:30;               %%25
innum=24;            
outnum=4;
 


%权值初始化
w1=rands(midnum,innum);            %25*24
b1=rands(midnum,1);                %25*1
w2=rands(midnum,outnum);           %25*4
b2=rands(outnum,1);                %4*1


w2_1=w2;w2_2=w2_1;
w1_1=w1;w1_2=w1_1;
b1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;


%学习率
xite=0.1;
alfa=0.01;           %什么 ,貌似没用过


%% 网络训练
for ii=1:10           %训练了10次
    E(ii)=0;
    for i=1:1:1500
       %% 网络预测输出 
        x=inputn(:,i);          %取出第一组    24*1
        % 隐含层输出
        for j=1:1:midnum         %1~25
            I(j)=inputn(:,i)'*w1(j,:)'+b1(j);   %(1*24)*(24*1)*b1
            Iout(j)=1/(1+exp(-I(j)));           %带入函数公式1*25 Iout     
        end
        % 输出层输出
        yn=w2'*Iout'+b2;             %(4*25)*(25*1)+(4*1)
        
       %% 权值阀值修正
        %计算误差
        e=output_train(:,i)-yn;     %4*1500取一个4*1
        E(ii)=E(ii)+sum(abs(e));
        
        %计算权值变化率
        dw2=e*Iout;
        db2=e';
        
        for j=1:1:midnum
            S=1/(1+exp(-I(j)));
            FI(j)=S*(1-S);             %【Hj-(1-Hj)】
        end      
        for k=1:1:innum
            for j=1:1:midnum
                dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
                db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
            end
        end
           
        w1=w1_1+xite*dw1';
        b1=b1_1+xite*db1';
        w2=w2_1+xite*dw2';
        b2=b2_1+xite*db2';
        
        w1_2=w1_1;w1_1=w1;
        w2_2=w2_1;w2_1=w2;
        b1_2=b1_1;b1_1=b1;
        b2_2=b2_1;b2_1=b2;             %%以上的对应公式来看
    end
end
 


%% 语音特征信号分类
inputn_test=mapminmax('apply',input_test,inputps);


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


%预测的输出


%% 结果分析
%根据网络输出找出数据属于哪类
for i=1:500
    output_fore(i)=find(fore(:,i)==max(fore(:,i)));%max(fore(:,i))表示在i列中的最大值. 
%fore(:,i)==max(fore(:,i))表示用fore(:,i)这个outnum×1的矩阵中的每一个值与这一列中的最大值相比,
%相等则为真,记作1,不相等则为假,记作0,所以fore(:,i)==max(fore(:,i))是一个outnum×1矩阵 
%find的作用,在这里是返回非0值在矩阵中所在的位置 
%output_fore是一个1×500的矩阵
end


%BP网络预测误差
error=output_fore-output1(n(1501:2000))';






%%%%画出预测语音种类和实际语音种类的分类图
%{
figure(1)
plot(output_fore,'r')
hold on
plot(output1(n(1501:2000))','b')
legend('预测语音类别','实际语音类别')
saveas(gcf,'2.png');
%%%%画出误差图
figure(2)
plot(error)
title('BP网络分类误差','fontsize',12)
xlabel('语音信号','fontsize',12)
ylabel('分类误差','fontsize',12)
saveas(gcf,'1.png');%print -dtiff -r600 1-4
%}
k=zeros(1,4);  
%找出判断错误的分类属于哪一类
for i=1:500
    if error(i)~=0             %~=表示不等于
        [b,c]=max(output_test(:,i));   %表示output_test的第i列中的最大值和所在位置,b为最大值,c为所在位置
        switch c
            case 1 
                k(1)=k(1)+1;
            case 2 
                k(2)=k(2)+1;
            case 3 
                k(3)=k(3)+1;
            case 4 
                k(4)=k(4)+1;
        end
    end
end


%找出每类的个体和
kk=zeros(1,4);
for i=1:500
    [b,c]=max(output_test(:,i));
    switch c
        case 1
            kk(1)=kk(1)+1;
        case 2
            kk(2)=kk(2)+1;
        case 3
            kk(3)=kk(3)+1;
        case 4
            kk(4)=kk(4)+1;
    end
end


%正确率


rightridio=(kk-k)./kk;
kkk(1,midnum-14)=1-(sum(rightridio)./4)
end


plot(kkk)
saveas(gcf,'kkk.png');
title('不同隐含层节点对应的误差率');

***************************************************************************************************************************************




这就是上述程序测出的图。


这是书上给的原始图。








  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
语音特征信号分类是指根据语音信号的特征对不同的语音进行分类。而bp神经网络是一种常用的神经网络算法,用来处理分类问题。在python中,可以使用各种库和工具来实现语音特征信号分类bp神经网络。 首先,需要使用python库来读取语音信号,并提取出语音的特征。这可以通过使用Python中的音频处理库如Librosa或者PyAudio等来实现。将提取出的语音特征作为输入数据,然后将每个语音对应的分类标签作为输出数据。 接着,可以使用Python中的神经网络库如TensorFlow或者Keras来构建bp神经网络模型。可以创建包含输入层、隐藏层和输出层的神经网络结构。同时,可以根据具体的问题来选择合适的激活函数、损失函数和优化器等来训练bp神经网络模型,以提高分类准确率。 然后,使用python来加载训练好的bp神经网络模型,并对新的语音特征信号进行分类预测。通过对输入数据进行前向传播,可以得到神经网络对每个语音的分类预测结果。 最后,可以通过python来评估bp神经网络模型的性能,并对分类结果进行分析和可视化。可以使用混淆矩阵、准确率、召回率等指标来评估模型的分类效果,从而优化bp神经网络模型的表现。 总之,通过使用python实现语音特征信号分类bp神经网络,可以有效地对语音进行自动分类和识别,为语音处理和语音识别领域提供更多的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值