使用MatConvNet进行二进制分类的CNN

时间:2017-01-18 07:13:23

标签: matlab deep-learning conv-neural-network matconvnet

我已经开始在MatConvNet中使用基本二进制分类的CNN。我有90张图片,共有750架飞机和地面真值箱。使用接地盒我已将所有飞机图像块作为正样本提取出来并为输入生成变量。这是MATLAB代码:

Npos =  numel(p_regions);
Npos_train = floor(0.25*Npos); 
Npos_val = floor(0.25*Npos);
Npos_test = floor(0.50*Npos);

imdb.images.set =[ ones( 1, Npos_train ) 2*ones( 1, Npos_val) 3*ones( 1, Npos_test)];
for i=1:Npos
        im= imresize (double(p_regions{i,:}),[50,50]);
    imdb.images.data(:,:,:, i) = im;
    imdb.images.labels(i) = 1;
end
imdb.meta.sets = {'train', 'val', 'test'} ;

如果我合并了飞机(正面)和非正面(负面)图像补丁,那么代码会是这样吗?

Npos_train = floor(0.25* (Npos+Nneg)); 
Npos_val = floor(0.25*(Npos+Nneg));
Npos_test = floor(0.50*(Npos+Nneg));
for i=1:Npos
            im= imresize (double(p_regions{i,:}),[50,50]);
        imdb.images.data(:,:,:, i) = im;
        imdb.images.labels(i) = 1;
    end
for i=1:Nneg
            im= imresize (double(n_regions{i,:}),[50,50]);
        imdb.images.data(:,:,:, I+Npos) = im;
        imdb.images.labels(I+Npos) = 0;
    end
imdb.images.set =[ ones( 1, Npos_train ) 2*ones( 1, Npos_val) 3*ones( 1, Npos_test)];

images.data将像[All Positives All Negatives]

images.labels将整理数据[全部1&#39全部0'] 和images.set将是images.set = [ones(1,Npos_train)2 * ones(1,Npos_val)3 * ones(1,Npos_test)];

问:这让我感到困惑的是: 如果我们想要200个样本进行培训。那么如果数据存储在images.dataimages.labels中,CNN将如何自动采集正样本和负样本?

1 个答案:

答案 0 :(得分:1)

您应该自己验证。在打印相应标签时,对数据进行采样并绘制图像。

即使我现在告诉你这个代码是否正确,我不能这样做,因为我无法访问数据集,我无法尝试你的代码。但是,您必须能够在整个过程中验证您的数据,以验证您是否正在学习正确的事情。因此,我建议你自己验证一下。它将帮助您提高深度学习技能。

编辑:

数据数组的相同索引对应于labels数组中的相同索引。因此,如果一架飞机的标签是0,它就知道它是假的,如果不是,它就知道它是真的。

网络实际上不知道哪个标签对应哪个动作,它只是学会区分这两个类。我建议通过mathconvnet教程(比如这个:http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.html)来理解这些概念。