【情感识别】基于神经网络的语音情感识别( 三 )


8 BP网络的改进
P算法改进的主要目标是加快训练速度,避免陷入局部极小值等,常见的改进方法有带动量因子算法、自适应学习速率、变化的学习速率以及作用函数后缩法等 。动量因子法的基本思想是在反向传播的基础上,在每一个权值的变化上加上一项正比于前次权值变化的值,并根据反向传播法来产生新的权值变化 。而自适应学习 速率的方法则是针对一些特定的问题的 。改变学习速率的方法的原则是,若连续几次迭代中,若目标函数对某个权倒数的符号相同,则这个权的学习速率增加,反之若符号相反则减小它的学习速率 。而作用函数后缩法则是将作用函数进行平移,即加上一个常数 。
二、源代码
lc close allclear allload A_fear fearVec;load F_happiness hapVec;load N_neutral neutralVec;load T_sadness sadnessVec;load W_anger angerVec;trainsample(1:30,1:140)=angerVec(:,1:30)';trainsample(31:60,1:140)=hapVec(:,1:30)';trainsample(61:90,1:140)=neutralVec(:,1:30)';trainsample(91:120,1:140)=sadnessVec(:,1:30)';trainsample(121:150,1:140)=fearVec(:,1:30)';trainsample(1:30,141)=1;trainsample(31:60,141)=2;trainsample(61:90,141)=3;trainsample(91:120,141)=4; trainsample(121:150,141)=5;testsample(1:20,1:140)=angerVec(:,31:50)';testsample(21:40,1:140)=hapVec(:,31:50)';testsample(41:60,1:140)=neutralVec(:,31:50)';testsample(61:80,1:140)=sadnessVec(:,31:50)';testsample(81:100,1:140)=fearVec(:,31:50)';testsample(1:20,141)=1;testsample(21:40,141)=2;testsample(41:60,141)=3;testsample(61:80,141)=4; testsample(81:100,141)=5;class=trainsample(:,141);sum=bpnn(trainsample,testsample,class);figure(1)bar(sum,0.5);set(gca,'XTickLabel',{'生气','高兴','中性','悲伤','害怕'});ylabel('识别率');xlabel('五种基本情感');p_train=trainsample(:,1:140)';t_train=trainsample(:,141)';p_test=testsample(:,1:140)';t_test=testsample(:,141)';sumpnn=pnn(p_train,t_train,p_test,t_test);figure(2)bar(sumpnn,0.5);set(gca,'XTickLabel',{'生气','高兴','中性','悲伤','害怕'});ylabel('识别率');xlabel('五种基本情感');sumlvq=lvq(trainsample,testsample,class);function sum=bpnn(trainsample,testsample,class)%输入参数:trainsample是训练样本,testsample是测试样本,class表示训练样本的类别,与trainsample中数据对应%sum:五种基本情感的识别率for i=1:140feature(:,i)= trainsample(:,i);end%特征值归一化[input,minI,maxI] = premnmx( feature');%构造输出矩阵s = length( class ) ;output = zeros( s , 5) ;for i = 1 : s output( i , class( i )) = 1 ;end%创建神经网络net = newff( minmax(input) , [10 5] , { 'logsig' 'purelin' } , 'traingdx' ) ;%创建前馈神经网络%设置训练参数net.trainparam.show = 50 ;net.trainparam.epochs = 150 ;net.trainparam.goal = 0.1 ;net.trainParam.lr = 0.05 ;%开始训练net = train( net, input , output' ) ;%读取测试数据for i=1:140featuretest(:,i)= testsample(:,i);endc=testsample(:,141);%测试数据归一化testInput = tramnmx(featuretest' , minI, maxI ) ;%仿真Y = sim( net , testInput ) sum=[0 0 0 0 0]; %每类情感正确识别个数%统计识别正确样本数 for i=1:20if Y(1,i)>Y(2,i)&&Y(1,i)>Y(3,i)&&Y(1,i)>Y(4,i)&&Y(1,i)>Y(5,i)sum(1)=sum(1)+1;endfunction sumlvq=lvq(trainsample,testsample,class)P=trainsample(:,1:140)';C=class';T=ind2vec(C);net=newlvq(minmax(P),20,[0.2 0.2 0.2 0.2 0.2],0.1); %创建lvq网络w1=net.IW{1};net.trainParam.epochs=100;net=train(net,P,T);y=sim(net,testsample(:,1:140)');y3c=vec2ind(y);sumlvq=[0 0 0 0 0]; %每类情感正确识别个数%统计识别正确样本数 for i=1:20if y3c(i)==1sumlvq(1)=sumlvq(1)+1;endendfor i=21:40if y3c(i)==2sumlvq(2)=sumlvq(2)+1;endendfor i=41:60if y3c(i)==3sumlvq(3)=sumlvq(3)+1;endendfor i=61:80if y3c(i)==4sumlvq(4)=sumlvq(4)+1;endendfor i=81:100end