語音學習筆記9------Matlab R2015a實現BP神經網路的嗓音識別

塵封的記憶0發表於2017-03-12

本來博主應該要搞卷積神經網路的,但是由於博主是這方面的小

白,都是從0開始的,所以怕一口吃下去咽死,還是先從BP神經網

絡學起,後面的博文會陸陸續續推出實現卷積神經網路的嗓音識

別的。

1.1.1 BP 神經網路概述
BP 神經網路是一種多層前饋神經網路,該網路的主要特點是訊號前向傳遞,誤差反向傳
播。在前向傳遞中,輸入訊號從輸入層經隱含層逐層處理,直至輸出層。每一層的神經元狀態
隻影響下一層神經元狀態。如果輸出層得不到期望輸出,則轉入反向傳播,根據預測誤差調整
網路權值和閾值,從而使 BP 神經網路預測輸出不斷逼近期望輸出。 BP 神經網路的拓撲結構
BP 神經網路可以看成一個非線性函式,網路輸入值和預測值分別為該函式的自變數和因變數。

當輸入節點數為 n ,輸出節點數為
m 時, BP 神經網路就表達了從 n 個自變數到 m 個因變數的函式對映關係。
BP 神經網路預測前首先要訓練網路,通過訓練使網路具有聯想記憶和預測能力。 BP 神
經網路的訓練過程包括以下幾個步驟。
步驟 1 :網路初始化。根據系統輸入輸出序列( X ,Y )確定網路輸入層節點數 n 、隱含層節
點數 l ,輸出層節點數 m ,初始化輸入層、隱含層和輸出層神經元之間的連線權值 ω
ij,ωjk,初始化隱含層閾值 a ,輸出層閾值 b ,給定學習速率和神經元激勵函式。
步驟 2 :隱含層輸出計算。根據輸入向量 X ,輸入層和隱含層間連線權值 ωij
以及隱含層閾值 a ,計算隱含層輸出 H 。
步驟 3 :輸出層輸出計算。根據隱含層輸出 H ,連線權值 ωjk和閾值 b ,計算 BP 神經網路預測輸出 O 。
步驟 4 :誤差計算。根據網路預測輸出 O 和期望輸出 Y ,計算網路預測誤差 e 。
步驟 5 :權值更新。根據網路預測誤差 e 更新網路連線權值 ω
步驟 6 :閾值更新。根據網路預測誤差 e 更新網路節點閾值 a ,
步驟 7 :判斷演算法迭代是否結束,若沒有結束,返回步驟 2 。
1.1.2  語音特徵訊號識別
語音特徵訊號識別是語音識別研究領域中的一個重要方面,一般採用模式匹配的原理解
決。語音識別的運算過程為:首先,待識別語音轉化為電訊號後輸入識別系統,經過預處理後
用數學方法提取語音特徵訊號,提取出的語音特徵訊號可以看成該段語音的模式。然後將該
段語音模型同已知參考模式相比較,獲得最佳匹配的參考模式為該段語音的識別結果。語音
本案例選取了民歌、古箏、搖滾和流行四類不同音樂,用 BP 神經網路實現對這四類音樂
的有效分類。每段音樂都用倒譜系數法提取 500 組 24 維語音特徵訊號,提取出的語音特徵信
1.2  模型建立
BP 神經網路構建根據系統輸入輸出資料特點確定 BP 神經網路的結構,由於語音特徵輸
入訊號有 24 維,待分類的語音訊號共有 4 類,所以 BP 神經網路的結構為 24 — 25 — 4 ,即輸入
層有 24 個節點,隱含層有 25 個節點,輸出層有 4 個節點。
BP 神經網路訓練用訓練資料訓練 BP 神經網路。共有 2000 組語音特徵訊號,從中隨機

選擇 1500 組資料作為訓練資料訓練網路,500 組資料作為測試資料測試網路分類能力。


BP 神經網路分類用訓練好的神經網路對測試資料所屬語音類別進

號。BP 神經網路構建根據系統輸入輸出資料特點確定 BP 神經網

絡的結構,由於語音特徵輸入訊號有 24 維,待分類的語音訊號共有4

類,所以 BP 神經網路的結構為 24 — 25 — 4 ,即輸入層有 24 個節

點,隱含層有 25 個節點,輸出層有 4 個節點。BP 神經網路訓練用

訓練資料訓練 BP 神經網路。共有 2000 組語音特徵訊號,從中機

選擇 1500 組資料作為訓練資料訓練網路,500 組資料作為測試數

據測試網路分類能力。

BP 神經網路分類用訓練好的神經網路對測試資料所屬語音類別進

行分類。

%% 清空環境變數
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);

%輸入輸出資料
input=data(:,2:25);
output1 =data(:,1);

%把輸出從1維變成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);

%% 網路結構初始化
innum=24;
midnum=25;
outnum=4;
 

%權值初始化
w1=rands(midnum,innum);
b1=rands(midnum,1);
w2=rands(midnum,outnum);
b2=rands(outnum,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
    E(ii)=0;
    for i=1:1:1500
       %% 網路預測輸出 
        x=inputn(:,i);
        % 隱含層輸出
        for j=1:1:midnum
            I(j)=inputn(:,i)'*w1(j,:)'+b1(j);
            Iout(j)=1/(1+exp(-I(j)));
        end
        % 輸出層輸出
        yn=w2'*Iout'+b2;
        
       %% 權值閥值修正
        %計算誤差
        e=output_train(:,i)-yn;     
        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);
        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'+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);
        
        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)));
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));
        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

效果圖




不懂的可以加我的QQ群:522869126(語音訊號處理) 歡迎你

到來哦,看了博文給點腳印唄,謝謝啦~~



相關文章