前情提要:
数据集读取方式 -> https://blog.csdn.net/Carriefuu/article/details/102702770
训练函数 -> https://blog.csdn.net/Carriefuu/article/details/102719761
1.analyze
测试迭代次数/batchsize与错误率的关系。
% 本函数功能为:
% 通过改变batchsizes数值优化错误率
% 类推,本函数亦可用于通过改变迭代次数优化错误率
% 本函数涉及的参数为:
% 输入:cnn -> 初始设定的卷积神经网络
% train_x -> 训练图像数据;train_y -> 训练图像数据标签
% test_x -> 测试图像数据;test_y -> 测试图像标签
% opts -> 卷积神经网络相关参数
% 输出:errr -> 结果错误率向量
function errr = analyze(cnn,train_x,train_y,test_x,test_y,opts)
disp('开始优化CNN');
for i=1:1:5
% opts.batchsize=5*i;
opts.numepochs=i;% numepochs迭代次数
cnn=cnnsetup(cnn,train_x,train_y);
[cnn,loss]=cnntrain(cnn,train_x,train_y,opts);
[err_rate,err_num]=cnntest(cnn,test_x,test_y);
errr(i)=err_rate*100;
i=i+1;
end
%batchsizes=5:5:25;
numepochs=1:1:5;
%plot(batchsizes,errr);
plot(numepochs,errr);
%xlabel('Batchsizes');
xlabel('Numepochs');
ylabel('Error rate%');
%title('Batchsizes vs Error rate (n=1)');
title('Numepochs vs Error rate (Batchsize=20)');
end
2.imagetest
自己导入手写图片而非测试库图片进行测试。
% 本函数功能为:
% 输入自己的手写图片进行测试
% 本函数涉及的参数为:
% 输入:cnn -> 训练好的卷积神经网络
% 输出:answer -> 手写识别结果
function [answer] = imagetest(cnn)
% 读取该文件夹的所有文件
% 手写图像文件已经过预处理,均为28x28的png图像
pt = 'C:\Users\Teacher\Desktop\Lzu\课程设计\testimage\';
ext = '*.png';
dis = dir([pt ext]);
nms = {dis.name};
for i=1:length(nms)
nm = [pt nms{i}];
image = imread(nm);
image = double(image);
% 灰度值处理采用了((R+G+B)/3)/255的归一化处理
data(:,:,i) = 3 - image(:,:,1)/255 - image(:,:,2)/255 - image(:,:,3)/255;
end
% 进入卷积神经网络
cnn = cnnff(cnn,data);
answer = cnn.o;
% 输出卷积神经网络预测结果
[~,answer] = max(answer);
end
btw,CSDN的博客可以上传文件吗?可以传我就把我的图像传上来,但是我没找到(……),这个图像就是在画图板上画的,然后改变了一下图像大小变成28x28的,大家也可以自己画。
跑的时候记得改文件路径!
我们跑出来结果不是很好,感觉原因还是不知道MNIST怎么做的灰度值归一化,上面那个归一化是我乱做的,看起来就很没有科学道理……如果有看到这里的人找到了更好的方法,希望一定要告诉我呀!谢谢!