使用 MatConvNet 进行二进制分类的 CNN
CNN for Binary classification using 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
会像 [所有正数所有负数]
images.labels
将组织数据 [全 1 全部 0 ]
images.set 将是 images.set =[ ones( 1, Npos_train ) 2*ones( 1, Npos_val) 3*ones( 1, Npos_test)] ;
问:这里让我感到困惑的是:
如果我们想要 200 个样本进行训练。那么如果数据存储在 images.data
和 images.labels
中,CNN 如何自动获取正样本和负样本?
你应该自己验证一下。在打印相应标签的同时获取数据样本并绘制图像。
即使我现在告诉你这段代码是否正确,顺便说一下,我也不能告诉你,因为我无法访问数据集,也无法尝试你的代码。但是,无论如何,您都必须能够在整个过程中验证您的数据,以验证您正在学习正确的东西。因此,我建议您自己验证一下。它将帮助您提高深度学习技能。
编辑:
数据数组的相同索引对应于标签数组中的相同索引。因此,如果一架飞机的标签为 0,它就知道它是假的,如果不是,它就知道它是真的。
网络实际上不知道哪个标签对应哪个动作,它只是学会区分两者类。我建议通过 mathconvnet 的教程(比如这个:http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.html)来理解这些概念。
我已经开始在 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
会像 [所有正数所有负数]
images.labels
将组织数据 [全 1 全部 0 ]
images.set 将是 images.set =[ ones( 1, Npos_train ) 2*ones( 1, Npos_val) 3*ones( 1, Npos_test)] ;
问:这里让我感到困惑的是:
如果我们想要 200 个样本进行训练。那么如果数据存储在 images.data
和 images.labels
中,CNN 如何自动获取正样本和负样本?
你应该自己验证一下。在打印相应标签的同时获取数据样本并绘制图像。
即使我现在告诉你这段代码是否正确,顺便说一下,我也不能告诉你,因为我无法访问数据集,也无法尝试你的代码。但是,无论如何,您都必须能够在整个过程中验证您的数据,以验证您正在学习正确的东西。因此,我建议您自己验证一下。它将帮助您提高深度学习技能。
编辑:
数据数组的相同索引对应于标签数组中的相同索引。因此,如果一架飞机的标签为 0,它就知道它是假的,如果不是,它就知道它是真的。
网络实际上不知道哪个标签对应哪个动作,它只是学会区分两者类。我建议通过 mathconvnet 的教程(比如这个:http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.html)来理解这些概念。