主要来源模式识别课程大作业,本文首先感谢当初的助教和一起完成作业的队友
matconvnet在matlab下封装了CNN常见算法,网址http://www.vlfeat.org/matconvnet/,本文采用matconvnet-1.0-beta16.tar.gz
第一题: 运用matconvet提供的mnist网络结构,
通过train文件夹中人脸图片训练网络(训练集),通过val文件夹调整网络结构(验证集),最后通过test文件夹测试网络性能(测试集)
第一题: 设计一个神经网络,并与第一题比较
第一题
1.利用train和val文件夹进行训练和调参:
利用matconvnet工具包中对mnist手写数字体设计的cnn结构,识别人脸性别。主程序为“cnn_mnist.m”,而cnn结构初始化在“cnn_mnist_init.m”中完成,网络结构不需要重新设计,只需要在cnn_mnist.m中更改数据的输入,在cnn_mnist_init.m更改网络的输出。
对于本题数据集,“train”中图片为训练集,“val”中为验证集,“test”中为测试集。首先利用“train”和“val”中人脸图片训练cnn网络权重,最后对训练好的网络用“test”中数据进行测试。
本题主程序所在M文件为“cnn_mnist_new.m”;网络结构文件为“cnn_mnist_init_new.m”;“test_p1.m”为对训练好的网络进行测试的主程序。
网络激活函数,在缺省情况下,默认为“sigmoid”。
首先在“cnn_mnist_init_new.m”中先拷贝“cnn_mnist.m”中代码,然后主要更改其中“getMnistImdb”函数。由于mnist数据集中的图像数据28*28 ,而本次实验中,所用图片大小为100*100 ,因此,需要把这些数字图像压缩为28*28 。
函数“getMnistImdb”中变量“x1”存储训练集中的图片,男性和女性的人脸图片给300张,其前300维存储男性,后300维存储女性;而变量“y1”存储训练集对应的标签,也是其前300维存储男性,后300维存储女性,这里需要注意的是,matconvnet不能把类别标签设置为“0”,否则对其他一些类别不能再识别;而本次作业为二分类问题,这里,男性对应于标签“1”,女性对应于标签“2”。同理,“x2”和“y2”对应于验证集中的数据,其中男性和女性图片各80张。
作为说明,这里只给出读取训练集数据中女性的示例代码:
%x1(:,:,1:300) stores female images in the train set
%x1(:,:,301:600) stores male images in the train set
x1=zeros(28,28,600);
%y1(1:300) stores female labels(1) in the train set
%y1(301:600) stores male labels(2) in the train set
y1=cat(2,ones(1,300),ones(1,300)+1);
%读取训练集图片-female
img_file_path=fullfile(vl_rootnn,'examples\mnist\image\image\new\train\female');
img_dir=dir(img_file_path);
for i=1:length(img_dir)-2 filename=sprintf('%s\\%s\\fy.bmp',img_file_path,img_dir(i+2).name);
I=imread(filename);
I=imresize(I,[28,28]); %将图片压缩为28*28大小
x1(:,:,i)=I;
end
另外,为了防止过拟合,“cnn_mnist_init_new.m”中加入dropout,所谓“dropout”就是在训练过程中,随机让一些节点不参与计算,加入方式为:
net.layers{end+1} = struct('type', 'dropout', 'rate', 0.5);
并且迭代次数设置为300,最重要的是&#