人工神经网络之BP语音识别


问题及要求

语音特征识别是模式识别的一个重要研究内容,对本案例,提取了民歌,古筝、摇滚和流行四类不同音乐的24维特征向量各500组,希望用BP/RBF网络实现对着四类音乐的有效分类。

数据文件见附件,语音特征信号分类.zip, 其中,datai.mat(i=1:4)分别代表4类音乐的特征数据,数据长度为500*25,其中第一列代表类别,分别为1~4.

要求:
1)利用其中1500为训练数据,500为测试数据,检验分类效果;
2)比较采用2-3种不同的隐含层神经元个数对分类精度的影响;
3)采用不同训练算法,比较traingd,traingdm,traingdx以及trainlm的效果(精度和锁链速度)。

要求给出源程序和神经网络结构示意图,计算结果及分析。

附件(.mat文件)

题目分析

该神经网络结构为输入层为24个神经元,隐含层有1层,神经元个数未定,输出层有4个神经元,神经网络结构如图1所示。
图1 神经网络结构

Matlab程序

%用BP网络语音识别
close all;
clear all;
clc;

%训练集

%训练数据预测数据提取及归一化

%下载四类语音信号
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,:);
%获取当前时间
t1 = clock; 
%12000间随机排序
k=rand(1,2000);
[m,n]=sort(k);

%输入输出数据
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),:)';


% 网络结构初始化
innum=24;
midnum=25;
outnum=4;

%创建网络

net = newff(minmax(input_train),[midnum,outnum],{'tansig' 'purelin'},'trainlm');    
%训练函数可选项:'trainlm', 'traingd', 'traingdm', 'traingdx'

net.trainParam.epochs = 50;
net.iw{1,1} = zeros(midnum,innum);
net.b{1} = zeros(midnum,1);
net.b{2} = zeros(outnum,1);
%训练
net = train(net,input_train,output_train);
y1 = sim(net,input_train);
%获取运行后时间
t2 = clock;
%测试
y2 = sim(net,input_test);
for i = 1:size(y2,2)
    y2_fore(i) = find(y2(:,i) == max(y2(:,i)));
    out_fore(i) = find(output_test(:,i) == 1);
end

%画出预测语音种类和实际语音种类的分类图
figure(1)
plot(y2_fore,'r')
hold on
plot(out_fore,'b')
legend('预测语音类别','实际语音类别')

error = y2_fore - out_fore;
%画出误差图
figure(2)
plot(error)
title('BP网络分类误差','fontsize',12)
xlabel('语音信号','fontsize',12)
ylabel('分类误差','fontsize',12)
%计算训练时间
t = etime(t2,t1);
%总正确率
total_accu = sum(y2_fore==out_fore)/length(out_fore)

结果分析

1)使用其中1500组为训练数据,500组为测试数据,输入层神经元24,隐含层神经元数目为30,输出层神经元数目为4的分类效果如图2所示。

图2 分类效果图
误差如图3所示。
图3 分类误差

2)使用不同的隐含层神经元个数对分类精度的影响如表1所示。

表1
由表1可看出,总体正确率随着神经元数目的减少,略微呈下降趋势,但差别不大。

3)四种不同训练算法性能如表2所示。

表2
由表2可知,trainlm算法性能最好,但所需时间较多。


文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录