MatConvNet卷积神经网络(四)——用自己的数据训练
2016-09-24 23:37
232 查看
尝试过从Matconvnet官网上下载的已经训练好的神经网络之后,最近自己训练了能够识别果树上红苹果的神经网络。先上图。源代码放在https://github.com/YunpengZhai/MATCONVNET
10/21/2016 更新:把滑动窗的代码放到了github上(结尾为**slide)
下面分享一下经验。
以下内容看之前,希望已经阅读过Matconvnet的官方文档matconvnet-manual,或者对机器学习的一些概念、卷积神经网络的原理具备基本的了解。
现在进入正题。
构建自己的神经网络,需要完成以下三个部分:
1.准备数据。
2.设计神经网络的结构。
3.设置参数,用数据训练网络。
一、准备数据。
数据在磁盘中的存放如下图:
之后,将文件中的图片导入、格式化、划分训练集测试集交叉验证集、求均值,然后以.mat格式存储在磁盘上。
%cnn_setup_data.m
二、初始化神经网络
这一部分包括了对神经网络各个层的设计(比如每一层的种类、维度、正则化,以及在训练中的一些参数等)。
%cnn_mnist_init.m
三、训练网络
%cnn_mnist.m
四、应用——测试程序
PS:写着写着就懒得写注释了。
配合滑动窗的话,结果如下:
10/21/2016 更新:把滑动窗的代码放到了github上(结尾为**slide)
下面分享一下经验。
以下内容看之前,希望已经阅读过Matconvnet的官方文档matconvnet-manual,或者对机器学习的一些概念、卷积神经网络的原理具备基本的了解。
现在进入正题。
构建自己的神经网络,需要完成以下三个部分:
1.准备数据。
2.设计神经网络的结构。
3.设置参数,用数据训练网络。
一、准备数据。
数据在磁盘中的存放如下图:
之后,将文件中的图片导入、格式化、划分训练集测试集交叉验证集、求均值,然后以.mat格式存储在磁盘上。
%cnn_setup_data.m
<span style="font-size:14px;">function imdb =cnn_setup_data(datadir) inputSize =[64,64]; subdir=dir(datadir); imdb.images.data=[]; imdb.images.labels=[]; imdb.images.set = [] ; imdb.meta.sets = {'train', 'val', 'test'} ; image_counter=0; trainratio=0.8; for i=3:length(subdir) imdb.meta.classes(i-2) = {subdir(i).name}; imgfiles=dir(fullfile(datadir,subdir(i).name)); imgpercategory_count=length(imgfiles)-2; disp([i-2 imgpercategory_count]); image_counter=image_counter+imgpercategory_count; for j=3:length(imgfiles) img=imread(fullfile(datadir,subdir(i).name,imgfiles(j).name)); img=imresize(img, inputSize(1:2)); img=single(img); imdb.images.data(:,:,:,end+1)=single(img); imdb.images.labels(end+1)= i-2; if j-2<imgpercategory_count*trainratio imdb.images.set(end+1)=1; else imdb.images.set(end+1)=3; end end end dataMean=mean(imdb.images.data,4); imdb.images.data = single(bsxfun(@minus,imdb.images.data, dataMean)) ; imdb.images.data_mean = single(dataMean);%!!!!!!!!!!! end</span>
二、初始化神经网络
这一部分包括了对神经网络各个层的设计(比如每一层的种类、维度、正则化,以及在训练中的一些参数等)。
%cnn_mnist_init.m
<span style="font-size:14px;">function net = cnn_mnist_init(varargin) % CNN_MNIST_LENET Initialize a CNN similar for MNIST opts.batchNormalization = true ; opts.networkType = 'simplenn' ; opts = vl_argparse(opts, varargin) ; rng('default'); rng(0) ; f=1/100 ; net.layers = {} ; net.layers{end+1} = struct('type', 'conv', ... 'weights', {{f*randn(5,5,3,20, 'single'), zeros(1, 20, 'single')}}, ... 'stride', 1, ... 'pad', 0) ; net.layers{end+1} = struct('type', 'pool', ... 'method', 'max', ... 'pool', [2 2], ... 'stride', 2, ... 'pad', 0) ; net.layers{end+1} = struct('type', 'conv', ... 'weights', {{f*randn(10,10,20,50, 'single'),zeros(1,50,'single')}}, ... 'stride', 1, ... 'pad', 0) ; net.layers{end+1} = struct('type', 'pool', ... 'method', 'max', ... 'pool', [2 2], ... 'stride', 2, ... 'pad', 0) ; net.layers{end+1} = struct('type', 'conv', ... 'weights', {{f*randn(10,10,50,500, 'single'), zeros(1,500,'single')}}, ... 'stride', 1, ... 'pad', 0) ; net.layers{end+1} = struct('type', 'relu') ; net.layers{end+1} = struct('type', 'conv', ... 'weights', {{f*randn(1,1,500,4, 'single'), zeros(1,4,'single')}}, ... 'stride', 1, ... 'pad', 0) ; net.layers{end+1} = struct('type', 'softmaxloss') ; % optionally switch to batch normalization if opts.batchNormalization net = insertBnorm(net, 1) ; net = insertBnorm(net, 4) ; net = insertBnorm(net, 7) ; end % Meta parameters net.meta.inputSize = [64 64] ; net.meta.trainOpts.learningRate = 0.0005 ; net.meta.trainOpts.numEpochs = 30 ; net.meta.trainOpts.batchSize = 200 ; % Fill in defaul values net = vl_simplenn_tidy(net) ; % Switch to DagNN if requested switch lower(opts.networkType) case 'simplenn' % done case 'dagnn' net = dagnn.DagNN.fromSimpleNN(net, 'canonicalNames', true) ; net.addLayer('top1err', dagnn.Loss('loss', 'classerror'), ... {'prediction', 'label'}, 'error') ; net.addLayer('top5err', dagnn.Loss('loss', 'topkerror', ... 'opts', {'topk', 5}), {'prediction', 'label'}, 'top5err') ; otherwise assert(false) ; end % -------------------------------------------------------------------- function net = insertBnorm(net, l) % -------------------------------------------------------------------- assert(isfield(net.layers{l}, 'weights')); ndim = size(net.layers{l}.weights{1}, 4); layer = struct('type', 'bnorm', ... 'weights', {{ones(ndim, 1, 'single'), zeros(ndim, 1, 'single')}}, ... 'learningRate', [1 1 0.05], ... 'weightDecay', [0 0]) ; net.layers{l}.biases = [] ; net.layers = horzcat(net.layers(1:l), layer, net.layers(l+1:end)) ;</span><span style="font-size:18px;"> </span>该网络结构:
三、训练网络
%cnn_mnist.m
<span style="font-size:14px;">function [net, info] = cnn_mnist(varargin) %CNN_MNIST Demonstrates MatConvNet on MNIST run(fullfile(fileparts(mfilename('fullpath')),... '..', '..', 'matlab', 'vl_setupnn.m')) ; opts.batchNormalization = false ; opts.networkType = 'simplenn' 4000 ; [opts, varargin] = vl_argparse(opts, varargin) ; sfx = opts.networkType ; if opts.batchNormalization, sfx = [sfx '-bnorm'] ; end datadir='E:\学习\机器学习\matconvnet-1.0-beta20\photos\multi-label'; opts.expDir = fullfile(vl_rootnn, 'data', ['mnist-zyp-' sfx]) ; [opts, varargin] = vl_argparse(opts, varargin) ; opts.dataDir = fullfile(vl_rootnn, 'data', 'mnist') ; opts.imdbPath = fullfile(opts.expDir, 'imdb.mat'); opts.train = struct() ; opts = vl_argparse(opts, varargin) ; if ~isfield(opts.train, 'gpus'), opts.train.gpus = []; end; % -------------------------------------------------------------------- % Prepare data % -------------------------------------------------------------------- net = cnn_mnist_init('batchNormalization', opts.batchNormalization, ... 'networkType', opts.networkType) ; if exist(opts.imdbPath, 'file') imdb = load(opts.imdbPath) ; else imdb=cnn_setup_data(datadir); mkdir(opts.expDir) ; save(opts.imdbPath, '-struct', 'imdb') ; end net.meta.classes.name = arrayfun(@(x)sprintf('%d',x),1:2,'UniformOutput',false) ; % -------------------------------------------------------------------- % Train % -------------------------------------------------------------------- switch opts.networkType case 'simplenn', trainfn = @cnn_train ; case 'dagnn', trainfn = @cnn_train_dag ; end [net, info] = trainfn(net, imdb, getBatch(opts), ... 'expDir', opts.expDir, ... net.meta.trainOpts, ... opts.train, ... 'val', find(imdb.images.set == 3)) ; net.meta.data_mean = imdb.images.data_mean; net.layers{end}.class = [1] ; % -------------------------------------------------------------------- function fn = getBatch(opts) % -------------------------------------------------------------------- switch lower(opts.networkType) case 'simplenn' fn = @(x,y) getSimpleNNBatch(x,y) ; case 'dagnn' bopts = struct('numGpus', numel(opts.train.gpus)) ; fn = @(x,y) getDagNNBatch(bopts,x,y) ; end % -------------------------------------------------------------------- function [images, labels] = getSimpleNNBatch(imdb, batch) % -------------------------------------------------------------------- images = imdb.images.data(:,:,:,batch) ; labels = imdb.images.labels(1,batch) ; % -------------------------------------------------------------------- function inputs = getDagNNBatch(opts, imdb, batch) % -------------------------------------------------------------------- images = imdb.images.data(:,:,:,batch) ; labels = imdb.images.labels(1,batch) ; if opts.numGpus > 0 images = gpuArray(images) ; end inputs = {'input', images, 'label', labels} ;</span><span style="font-size:18px;"> </span>
四、应用——测试程序
<span style="font-size:14px;">%初次运行一次,之后不再运行 %[net_bn, info_bn] = cnn_mnist('batchNormalization', true); load('E:\学习\机器学习\matconvnet-1.0-beta20\data\mnist-zyp-simplenn-bnorm\imdb.mat'); im=imread('E:\学习\机器学习\matconvnet-1.0-beta20\photos\QQ截图20160922172145.png'); im=imresize(im,[64 64 ]); imshow(im); im = single(im); im = im - images.data_mean; res = vl_simplenn(net_bn, im,[],[],... 'accumulate', 0, ... 'mode', 'test', ... 'backPropDepth', inf, ... 'sync', 0, ... 'cudnn', 1) ; scores = res(11).x(1,1,:); [bestScore, best] = max(scores); switch best case 1 title('判断结果:不是苹果'); case 2 title('判断结果:1个苹果'); case 3 title('判断结果:2个苹果'); case 4 title('判断结果:3个苹果'); end</span><span style="font-size:18px;"> </span>测试一下:
PS:写着写着就懒得写注释了。
配合滑动窗的话,结果如下:
相关文章推荐
- caffe:用自己的图像数据训练模型(图片分类)
- Caffe下自己的数据训练和测试
- Caffe学习系列(23):如何将别人训练好的model用到自己的数据上
- Fast RCNN 训练自己数据集 (2修改数据读取接口)
- caffe:用自己的图像数据训练模型
- caffe训练自己的数据
- Caffe-用自己的数据做训练
- caffe训练自己的数据
- py-faster-rcnn + ZF 实现自己的数据训练与检测(二)
- faster-rcnn安装,训练自己的数据
- Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning
- Caffe学习系列(23):如何将别人训练好的model用到自己的数据上
- Caffe学习——使用自己的数据(非图像)训练网络
- caffe windows 训练自己的图片数据
- 使用caffe训练自己的图像数据
- Caffe上训练使用自己的数据
- Fast RCNN 训练自己数据集 (2修改数据读取接口)
- 用自己的数据训练和测试“caffenet”
- mxnet 训练--如何生成rec 数据 +自己在本机测试的结果
- 用自己的数据训练Faster-RCNN