2

我已经通过提供的代码 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) ; 
4

2 回答 2

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)) ;
于 2016-02-28T11:09:27.050 回答
0

使用 matconvnet-1.0-beta24,可能会出现以下两个问题:

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

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

    im_=255-im_;
    
于 2017-08-21T17:36:12.777 回答