课程作业记录9:基于CNN的手写数字识别的测试函数/Matlab仿真

前情提要:
数据集读取方式 -> 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怎么做的灰度值归一化,上面那个归一化是我乱做的,看起来就很没有科学道理……如果有看到这里的人找到了更好的方法,希望一定要告诉我呀!谢谢!

你可能感兴趣的:(课程作业记录9:基于CNN的手写数字识别的测试函数/Matlab仿真)