小言_互联网的博客

Matlab入门5 图像识别基础算法

354人阅读  评论(0)

赞赏码 & 联系方式 & 个人闲话

配套课件可访问https://github.com/BIMK/MATLAB下载,是安徽大学Matlab本科教学课件,逻辑清晰,简洁明了,颇为实用,用来入门再好不过(机器学习方向)。

本系列博文是课后练习的个人解答,通过几个小实验展示matlab基本语法和技巧。接触Matlab也有几年了,略有心得,分享给大家。

 

【实验名称】图像识别

 

【实验目的】

1. 熟悉matlab图像识别的基础算法

2. 掌握基本的前馈神经网络算法

3. 掌握神经网络参数调优方法

 

【实验内容】

1. 采用面向对象编程实现简单的神经网络,并用于图像识别任务中;

2. 将神经网络用于ORL人脸数据库的分类任务中;

3. ORL数据库中含有40个人的黑白照片,其中每个人含有10幅照片,共400幅;

4. 每幅图像的大小为112*92*1,即每个样本的特征数为10304;

5. 共40个类别标签,即每个样本的标签数为40,且其中一个标签值为1、其它所有标签值为0;

6. 将每个人的前7幅图像作为训练样本(共280个),后3幅图像作为测试样本(共120个)

7. 寻找最优的网络超参数以尽可能降低误差

 

Main.m代码(详见注释)


  
  1. function main()
  2. clc; close all;
  3. Num = 40; Train = 7; Test= 3;
  4. %% 读取
  5. Xtrain = []; Xtest = [];
  6. for i = 1:Num
  7. for j = 1:Train+Test
  8. path = [ 'ORL/s',num2str(i), '/',num2str(j), '.pgm'];
  9. temp = imread(path);
  10. if j<=Train
  11. Xtrain = [Xtrain;double(reshape(temp, 1,size(temp, 1)*size(temp, 2)))];
  12. else
  13. Xtest = [Xtest ;double(reshape(temp, 1,size(temp, 1)*size(temp, 2)))];
  14. end
  15. end
  16. end
  17. %% pca
  18. [~,X] = pca([Xtrain;Xtest]);
  19. Xtrain = X( 1:size(Xtrain, 1),:);
  20. Xtest = X(size(Xtrain, 1)+ 1: end,:);
  21. %% 生成标签
  22. temp = eye(Num) ';
  23. Y1train = zeros(Num*Train,Num);
  24. Y1test = zeros(Num*Test ,Num);
  25. for i = 1:size(temp,1)
  26. Y1train(i*Train-6:i*Train,:) = repmat(temp(i,:),Train,1);
  27. Y1test (i*Test -2:i*Test ,:) = repmat(temp(i,:),Test ,1);
  28. end
  29. net = NN() ;
  30. net.train(Xtrain, Y1train);
  31. Ytrain = net.test(Xtrain) ;
  32. [~, Ytrain ] = max(Ytrain, [],2);
  33. [~, Y1train] = max(Y1train, [],2);
  34. mean(Ytrain ~= Y1train)
  35. Ytest = net.test(Xtest);
  36. [~, Ytest ] = max(Ytest, [],2);
  37. [~ ,Y1test] = max(Y1test, [],2);
  38. mean(Ytest ~= Y1test)
  39. end

NN.m代码(详见注释)


  
  1. classdef NN < handle
  2. properties
  3. % 网络的超参数
  4. nHidden = 51; % 隐层神经元数
  5. epoch = 100; % 训练迭代次数
  6. learning = 0.0006; % 学习率
  7. momentum = 0.51; % 动量法参数
  8. W = []; % 输入层与隐层之间权值
  9. V = []; % 隐层与输出层之前权值
  10. end
  11. methods
  12. function train(obj, X, Y1)
  13. % 根据训练集X和真实标签集Y1来训练神经网络
  14. obj.W = randn(size(X, 2)+ 1, obj.nHidden)/ 100;
  15. obj.V = randn(obj.nHidden+ 1,size(Y1, 2))/ 100;
  16. N = size(X, 1);
  17. for i = 1:obj.epoch
  18. clc; fprintf( 'ѵÁ·µÚ%d´Î',i);
  19. % 前馈阶段
  20. H = 1./( 1+exp(-[ones(N, 1),X]*obj.W));
  21. Y = [ones(N, 1),H]*obj.V;
  22. % 反馈阶段
  23. DV = [ones(N, 1),H] '*(Y-Y1);
  24. DW = [ones(N,1),X]'*((Y-Y1)*obj.V( 2: end,:) '.*H.*(1-H));
  25. % 动量更新权值
  26. if i==1
  27. MV = DV; MW= DW;
  28. else
  29. MV = (1-obj.momentum)*DV + obj.momentum*MV;
  30. MW = (1-obj.momentum)*DW + obj.momentum*MW;
  31. end
  32. obj.V = obj.V - obj.learning*MV;
  33. obj.W = obj.W - obj.learning*MW;
  34. end
  35. end
  36. function Y = test (obj, X)
  37. % 计算测试集X的预测标签集Y
  38. N = size(X,1);
  39. H = 1./(1+exp(-[ones(N,1),X]*obj.W));
  40. Y = [ones(N,1),H]*obj.V;
  41. end
  42. function c = complexity(obj)
  43. c = sum(sum(abs(obj.W))) + sum(sum(abs(obj.V)));
  44. end
  45. end
  46. end

运行结果

总结

参数优化的结果不太满意,手动调参只调到了0.0833,是k近邻法近两倍。参数并不是很好调,毕竟有随机化因素所以即使相同参数,训练出的模型的预测误差也会相差很多。

我尝试用进化算法进行调参,效果也并不是特别理想,试了多次,最小的误差大约是0.047,还是大于0.0417。

 


转载:https://blog.csdn.net/qq_37672864/article/details/117392262
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场