尝试过从Matconvnet官网上下载的已经训练好的神经网络之后,最近自己训练了能够识别果树上红苹果的神经网络。先上图。源代码放在https://github.com/YunpengZhai/MATCONVNET

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*trainratioimdb.images.set(end+1)=1;elseimdb.images.set(end+1)=3;endend
enddataMean=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.batchNormalizationnet = 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'% donecase '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') ;otherwiseassert(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 MNISTrun(fullfile(fileparts(mfilename('fullpath')),...'..', '..', 'matlab', 'vl_setupnn.m')) ;opts.batchNormalization = false ;
opts.networkType = 'simplenn' ;
[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) ;
elseimdb=cnn_setup_data(datadir);mkdir(opts.expDir) ;save(opts.imdbPath, '-struct', 'imdb') ;
endnet.meta.classes.name = arrayfun(@(x)sprintf('%d',x),1:2,'UniformOutput',false) ;% --------------------------------------------------------------------
%                                                                Train
% --------------------------------------------------------------------switch opts.networkTypecase '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 > 0images = 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 bestcase 1title('判断结果:不是苹果');case 2title('判断结果:1个苹果');case 3title('判断结果:2个苹果');case 4 title('判断结果:3个苹果');
end</span><span style="font-size:18px;">
</span>

测试一下:

PS:写着写着就懒得写注释了。

配合滑动窗的话,结果如下:

MatConvNet卷积神经网络(四)——用自己的数据训练相关推荐

  1. 卷积神经网络四种卷积类型

    卷积神经网络四种卷积类型 https://www.toutiao.com/a6631333810287936013/ 一般卷积 首先,我们需要就定义卷积层的一些参数达成一致. 卷积核大小(Kernel ...

  2. Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)

    Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...

  3. Deep Learning × ECG (4) :利用卷积神经网络CNN对心律失常ECG数据进行分类

    本文主要就是介绍搭建模型和模型训练了!! 文章目录 1. AAMI 标准 2. 模型搭建和训练 3. 模型搭建环境 1. AAMI 标准 根据 AAMI (简称:美国心脏病协会) 提供的标准:将心拍分 ...

  4. 卷积神经网络四:人脸识别和风格变迁

    1 什么是人脸识别 现在的人脸识别包含两个部分,人脸识别和活体检测.后一项技术确认你是一个活人.事实上,活体检测可以使用监督学习来实现,去预测是不是一个真人,这个方面我就不多说了.我主要想讲的是,如何 ...

  5. 深度篇—— CNN 卷积神经网络(四) 使用 tf cnn 进行 mnist 手写数字 代码演示项目

    返回主目录 返回 CNN 卷积神经网络目录 上一章:深度篇-- CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align 与 插值 本小节,细说 使用 tf cnn 进行 mn ...

  6. NNDL 实验六 卷积神经网络(5)使用预训练resnet18实现CIFAR-10分类

    目录 5.5实践:基于ResNet18网络完成图像分类任务 5.5.1数据处理 5.5.1.1数据集介绍 5.5.1.2 数据读取 5.5.1.2 数据集划分 5.5.2模型构建 5.5.2.1使用R ...

  7. 基于FPGA的卷积神经网络实现(七)数据读写

    目录: 简介 框架 资源分配(1) 资源分配(2) 数据量化(1) 数据量化(2) 数据读写 卷积模块 池化.全连接与输出 我发现点下面的链接会跳到一个不知道是谁的CSDN下面需要付费下载,这个很迷惑 ...

  8. 入门卷积神经网络(四)误差函数(损失函数)

    误差函数(损失函数) 监督学习的神经网络需要一个函数来测度模型的输出值p和真实因变量值y之间的差异,一般这种差异被称为残差或者误差. 但一个模型完美时(虽然不存在),其误差为0.当模型存在问题时,误差 ...

  9. FER基于卷积神经网络: 处理少量数据和训练样本订单FER with CNN:Coping with few data and the training sample order

    1.摘要 面部表情识别在过去的10年中一直是一个活跃的研究领域,其应用领域不断扩大,包括阿凡达动画.神经营销和社交机器人.面部表情的识别对于机器学习方法来说不是一个简单的问题,因为人们表现表情的方式可 ...

最新文章

  1. android 5.0 9300,三星Android5.0升级名单曝光 S2止步4.2
  2. python logging.getlogger_logging.getLogger与logger的父子关系
  3. centos下性能分析工具perf的安装和简单使用
  4. linq TO XML 基础
  5. 高速缓存系统之redis c++使用实例
  6. c++ doxygen 注释规范_利用Doxygen给C程序生成注释文档
  7. JQuery文件上传控件Uploadify文档
  8. Linux内核深入理解中断和异常(2):初步中断处理-中断加载
  9. [转](转载+整理)超详细的cmake教程
  10. Linux系统环境下安装配置JDK
  11. Ubuntu系统下面软件安装更新命令
  12. js能调用c语言吗,HTML页面,测试JS对C函数的调用
  13. 美赛论文格式基本要求
  14. vue 头像修改-裁剪图片 vue-cropper
  15. python 爬取视频ts文件_python爬取视频网站中video标签的m3u8文件与ts文件
  16. 赋值语句的四元式【编译原理】
  17. EasyBoot常用的命令
  18. centos7环境下编译bitcoin
  19. linux2.6内核驱动程序注册函数,于PCI9656设备驱动程序的Linux2.6内核研究
  20. 企业微信网页授权及JS-SDK碰到检查域名所有权不通过的问题

热门文章

  1. 基于android小区智能管理,基于Android系统智能小区物业管理系统的设计
  2. SpringBoot实现SpringTask调度任务---实现间隔调度与CRON调度处理
  3. 【无标题】把一堆苹果分给n个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个?
  4. ai培训师讲师叶梓:计算机视觉领域的自监督学习模型——MAE-5
  5. 下午下班做了2张CD封面~
  6. 一款程序员不可不拥有的正规编程语言文档库查询软件——zeal
  7. Lagrangian Decomposition
  8. Python生成个性二维码详解!
  9. 大数据Spark实战视频教程-张长志-专题视频课程
  10. 从DICOM开始入门医学图像处理-2-VTK+Qt+VS开发环境搭建