《MATLAB 神经网络43个案例分析》:第27章 LVQ神经网络的预测——人脸朝向识别
1. 前言
《MATLAB 神经网络43个案例分析》是MATLAB技术论坛(www.matlabsky.com)策划,由王小川老师主导,2013年北京航空航天大学出版社出版的关于MATLAB为工具的一本MATLAB实例教学书籍,是在《MATLAB神经网络30个案例分析》的基础上修改、补充而成的,秉承着“理论讲解—案例分析—应用扩展”这一特色,帮助读者更加直观、生动地学习神经网络。
《MATLAB神经网络43个案例分析》共有43章,内容涵盖常见的神经网络(BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等)以及相关智能算法(SVM、决策树、随机森林、极限学习机等)。同时,部分章节也涉及了常见的优化算法(遗传算法、蚁群算法等)与神经网络的结合问题。此外,《MATLAB神经网络43个案例分析》还介绍了MATLAB R2012b中神经网络工具箱的新增功能与特性,如神经网络并行计算、定制神经网络、神经网络高效编程等。
近年来随着人工智能研究的兴起,神经网络这个相关方向也迎来了又一阵研究热潮,由于其在信号处理领域中的不俗表现,神经网络方法也在不断深入应用到语音和图像方向的各种应用当中,本文结合书中案例,对其进行仿真实现,也算是进行一次重新学习,希望可以温故知新,加强并提升自己对神经网络这一方法在各领域中应用的理解与实践。自己正好在多抓鱼上入手了这本书,下面开始进行仿真示例,主要以介绍各章节中源码应用示例为主,本文主要基于MATLAB2015b(32位)平台仿真实现,这是本书第二十七章LVQ神经网络的预测实例,话不多说,开始!
2. MATLAB 仿真示例一
打开MATLAB,点击“主页”,点击“打开”,找到示例文件
选中chapter27_lvq.m,点击“打开”
chapter27_lvq.m源码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: LVQ神经网络的预测——人脸识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LVQ神经网络的预测——人脸识别
%% 清除环境变量
clear all
clc
tic
%% 人脸特征向量提取
% 人数
M = 10;
% 人脸朝向类别数
N = 5;
% 特征向量提取
pixel_value = feature_extraction(M,N);
%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label = randperm(M*N);
% 人脸朝向标号
direction_label = repmat(1:N,1,M);
% 训练集
train_label = rand_label(1:30);
P_train = pixel_value(train_label,:)';
Tc_train = direction_label(train_label);
T_train = ind2vec(Tc_train);
% 测试集
test_label = rand_label(31:end);
P_test = pixel_value(test_label,:)';
Tc_test = direction_label(test_label);
%% 创建LVQ网络
for i = 1:5
rate{
i} = length(find(Tc_train == i))/30;
end
net = newlvq(minmax(P_train),20,cell2mat(rate),0.01,'learnlv1');
% 设置训练参数
net.trainParam.epochs = 100;
net.trainParam.goal = 0.001;
net.trainParam.lr = 0.1;
%% 训练网络
net = train(net,P_train,T_train);
%% 人脸识别测试
T_sim = sim(net,P_test);
Tc_sim = vec2ind(T_sim);
result = [Tc_test;Tc_sim]
%% 结果显示
% 训练集人脸标号
strain_label = sort(train_label);
htrain_label = ceil(strain_label/N);
% 训练集人脸朝向标号
dtrain_label = strain_label - floor(strain_label/N)*N;
dtrain_label(dtrain_label == 0) = N;
% 显示训练集图像序号
disp('训练集图像为:' );
for i = 1:30
str_train = [num2str(htrain_label(i)) '_'...
num2str(dtrain_label(i)) ' '];
fprintf('%s',str_train)
if mod(i,5) == 0
fprintf('\n');
end
end
% 测试集人脸标号
stest_label = sort(test_label);
htest_label = ceil(stest_label/N);
% 测试集人脸朝向标号
dtest_label = stest_label - floor(stest_label/N)*N;
dtest_label(dtest_label == 0) = N;
% 显示测试集图像序号
disp('测试集图像为:');
for i = 1:20
str_test = [num2str(htest_label(i)) '_'...
num2str(dtest_label(i)) ' '];
fprintf('%s',str_test)
if mod(i,5) == 0
fprintf('\n');
end
end
% 显示识别出错图像
error = Tc_sim - Tc_test;
location = {
'左方' '左前方' '前方' '右前方' '右方'};
for i = 1:length(error)
if error(i) ~= 0
% 识别出错图像人脸标号
herror_label = ceil(test_label(i)/N);
% 识别出错图像人脸朝向标号
derror_label = test_label(i) - floor(test_label(i)/N)*N;
derror_label(derror_label == 0) = N;
% 图像原始朝向
standard = location{
Tc_test(i)};
% 图像识别结果朝向
identify = location{
Tc_sim(i)};
str_err = strcat(['图像' num2str(herror_label) '_'...
num2str(derror_label) '识别出错.']);
disp([str_err '(正确结果:朝向' standard...
';识别结果:朝向' identify ')']);
end
end
% 显示识别率
disp(['识别率为:' num2str(length(find(error == 0))/20*100) '%']);
toc
添加完毕,点击“运行”,开始仿真,输出仿真结果如下:
result =
1 至 19 列
2 4 3 3 1 1 1 5 2 2 4 2 5 4 1 1 5 3 2
2 4 3 3 4 1 4 5 2 2 4 2 5 4 1 1 5 3 2
20 列
1
1
训练集图像为:
1_5 2_1 2_3 2_5 3_1
3_2 3_3 3_4 3_5 4_1
4_3 4_4 5_2 5_3 5_4
5_5 6_1 6_3 6_5 7_2
7_3 7_4 8_2 8_4 9_2
9_4 9_5 10_3 10_4 10_5
测试集图像为:
1_1 1_2 1_3 1_4 2_2
2_4 4_2 4_5 5_1 6_2
6_4 7_1 7_5 8_1 8_3
8_5 9_1 9_3 10_1 10_2
图像5_1识别出错.(正确结果:朝向左方;识别结果:朝向右前方)
图像9_1识别出错.(正确结果:朝向左方;识别结果:朝向右前方)
识别率为:90%
时间已过 4.401417 秒。
依次点击Plots中的Performance,Training State,Confusion,Receiver Operating Characteristic得到以下图示结果:
3. MATLAB 仿真示例二
点击当前文件夹视图框中的chapter27_bp.m
打开chapter27_bp.m源码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: BP神经网络的预测——人脸识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% BP神经网络的预测——人脸识别
%% 清除环境变量
clear all
clc
tic
%% 人脸特征向量提取
% 人数
M = 10;
% 人脸朝向类别数
N = 5;
% 特征向量提取
pixel_value = feature_extraction(M,N);
%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label = randperm(M*N);
% 人脸朝向标号
direction_label = [1 0 0;1 1 0;0 1 0;0 1 1;0 0 1];
% 训练集
train_label = rand_label(1:30);
P_train = pixel_value(train_label,:)';
dtrain_label = train_label - floor(train_label/N)*N;
dtrain_label(dtrain_label == 0) = N;
T_train = direction_label(dtrain_label,:)';
% 测试集
test_label = rand_label(31:end);
P_test = pixel_value(test_label,:)';
dtest_label = test_label - floor(test_label/N)*N;
dtest_label(dtest_label == 0) = N;
T_test = direction_label(dtest_label,:)';
%% 创建BP网络
net = newff(minmax(P_train),[10,3],{
'tansig','purelin'},'trainlm');
% 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.show = 10;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.1;
%% 网络训练
net = train(net,P_train,T_train);
%% 仿真测试
T_sim = sim(net,P_test);
for i = 1:3
for j = 1:20
if T_sim(i,j) < 0.5
T_sim(i,j) = 0;
else
T_sim(i,j) = 1;
end
end
end
T_sim
T_test
toc
点击“运行”,开始仿真,输出仿真结果如下:
T_sim =
1 至 19 列
0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0
1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0
1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0
20 列
1
1
0
T_test =
1 至 19 列
0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1
1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0
1 1 0 1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0
20 列
1
1
0
时间已过 3.215773 秒。
依次点击Plots中的Performance,Training State,Regression可得到以下图示:
4. MATLAB 仿真示例三
点击当前文件夹视图框中的chapter_svm.m
打开chapter_svm.m源码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: SVM的预测——人脸识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% SVM的预测——人脸识别
%% 清除环境变量
clear all
clc
warning off
tic
%% 人脸特征向量提取
% 人数
M = 10;
% 人脸朝向类别数
N = 5;
% 特征向量提取
pixel_value = feature_extraction(M,N);
% 归一化
pixel_value = premnmx(pixel_value);
%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label = randperm(M*N);
% 人脸朝向标号
direction_label = repmat(1:N,1,M);
% 训练集
rand_train = rand_label(1:30);
Train = pixel_value(rand_train,:);
Train_label = direction_label(rand_train)';
% 测试集
rand_test = rand_label(31:end);
Test = pixel_value(rand_test,:);
Test_label = direction_label(rand_test)';
% SVM模型
model = svmtrain(Train_label,Train,'-c 2 -g 0.05');
% 仿真测试
[predict_label,accuracy] = svmpredict(Test_label,Test,model);
result_svm = [Test_label';predict_label']
toc
点击“运行”,开始仿真,输出仿真结果如下:
Accuracy = 100% (20/20) (classification)
result_svm =
1 至 19 列
5 2 4 3 5 3 4 4 3 2 4 4 3 5 3 5 1 5 2
5 2 4 3 5 3 4 4 3 2 4 4 3 5 3 5 1 5 2
20 列
4
4
时间已过 0.832052 秒。
样本图片文件夹如下:
5. 小结
本章继续采用LVQ神经网络进行预测,同时采用BP神经网络与SVM进行对比,得到结果如上图所示,可以看到预测效果LVQ神经网络<BP神经网络<SVM,想了其他LVQ神经网络示例的,可以回到本专栏上一章进行了解。对本章内容感兴趣或者想充分学习了解的,建议去研习书中第二十七章节的内容。后期会对其中一些知识点在自己理解的基础上进行补充,欢迎大家一起学习交流。