如何使用MatConvNet中使用cnn_mnist示例训练的网络?

时间:2016-01-06 23:25:14

标签: matlab mnist

我通过提供的代码cnn_mnist训练了一个cnn。之后,我尝试对图像进行分类,但我不明白为什么在以下代码之后出现此错误:

    [net, info] = cnn_mnist
net = 
    layers: {1x8 cell}
info = 
    train: [1x1 struct]
      val: [1x1 struct]
f=fopen(fullfile('.\data\mnist\', 't10k-images-idx3-ubyte'),'r') ;
x2=fread(f,inf,'uint8');
fclose(f) ;
x2=permute(reshape(x2(17:end),28,28,10e3),[2 1 3]) ;
im = x2(:,:,1); 
im = single(im);
 res = vl_simplenn(net,im);
Reference to non-existent field 'class'.
Error in vl_simplenn (line 163)
      res(i+1).x = vl_nnsoftmaxloss(res(i).x, l.class) ; 

2 个答案:

答案 0 :(得分:2)

我不确定为什么你的代码不会运行。我相信问题出在你的最后一层。默认情况下,它由softmaxloss定义,您应该将其更改为softmax。尝试在调用vl_simplenn之前添加此行:

net.layers{end}.type = 'softmax';

无论如何尝试这个适合我的代码(你应该从主MatConvNet文件夹运行它):

%%%%%%%%%%% run this lines only once at matlab startup
run matlab/vl_compilenn
run matlab/vl_setupnn
%%%%%%%%%%%

load('examples\mnist\data\mnist-bnorm\net-epoch-20.mat');  % files from training
net.layers{end}.type = 'softmax';
im = imread('Capture.jpg') ; % an image of a handwritten number
im = rgb2gray(im);
im_ = single(im) ; % note: 0-255 range
im_ = imresize(im_, net.meta.inputSize(1:2)+1) ;
load('examples\mnist\data\mnist-bnorm\imdb.mat')
im_ = im_ - images.data_mean;

% run the CNN
res = vl_simplenn(net, im_) ;

% show the classification result
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
best = best - 1;  % shift the score from 1:10 to 0:9
figure(1) ; clf ; imshow(im) ;
title(sprintf('The number is %s, score %.1f%%',...
net.meta.classes.name{best+1}-1, bestScore * 100)) ;

答案 1 :(得分:0)

使用matconvnet-1.0-beta24,可能存在以下两个问题:

  1. 而不是res = vl_simplenn(net, im_) ; 使用方法:

    res = vl_simplenn(net, im_, [], [], 'mode', 'test');
    
  2. 用于测试的图片背景应为黑色,手写编号应为白色。因此,如果您从Internet上下载带有白色背景和黑色数字的图片,请使用:

    im_=255-im_;