单片机分到王计元,除了you will go diee还有什么方法

&>&&>&&>&&>&matconvnet操作手册
matconvnet操作手册
上传大小:1.34MB
关于MATLAB环境下深度学习CNN的工具箱matconvnet的操作使用手册,也有关于CNN的一些知识介绍
嵌到我的页面
<input type="text" value="">
综合评分:0(0位用户评分)
所需积分:1
下载次数:13
审核通过送C币
创建者:bensnake
创建者:zhangguo5
创建者:zhangguo5
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
matconvnet操作手册
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:MatConvNet代码总结
&本文主要记录对MatConvNet代码的一些个人理解,方便以后使用(有些地方理解也许有偏差),不定期更新。。。。
一、训练过程中matlab命令窗口输出的speed,obj,top1误差,top5误差怎么计算的
这几个结果的计算过程在cnn_train这个m文件里面,设置断点跟踪即可得到相应的计算过程。为了方便说明,假设epoch数目为1,有2个batch,cnn_train函数在第一个batch上优化结束之后会分别得到两个数组error=[obj,
top1, top5]以及stats=sum([stats,[0 ;
error]],2),对这两个数组分别解释如下:obj为一个batch里所有样本的loss,相应地top1和top5分别为一个batch里所有样本的top1和top5误差之和;stats保存的是第1个batch上得到的error。第1个batch上结束之后,会在第2个batch上优化,同样地,此时error数组保存的是第2个batch的loss,top1和top5,需要注意的是此时的stats数组是2个batch的error数组求和。
& 下面讲matlab命令窗口输出的形如“training: epoch 01: batch
& 1/600: 174.4 Hz obj:2.3 top1e:0.88 top5e:0.39
[100/100]”的结果是如何计算的,计算很简单,如下:
obj=(stats数组的obj)/n,其中n=当前batch*batchSize,比如优化的是第2个batch的话就是n=2*batchSize,由此可以看出,其实n就是样本数目。top1和top5计算方法相同。
&一个epoch优化结束后,会输出figure绘制误差曲线,其实图上每个epoch对应的obj,top1,top5就是当前epoch最后一个batch对应的值。在回答我提的问题时,matconvnet作者答复如下:
the training error is computed as
the model is updated during an epoch, whereas the validation error
is computed on a “frozen” model at the end of an epoch. This is
implicit in how the code works. Let M_{N-1} be the model at epoch
N-1 and M_N the model at epoch M_N. Let M_{N-1} -& M’ -& M’’
-& M’’’ -& …. -& M_N the sequence of intermediate models
computed for each mini-batch processed during training. Then
Training error at epoch N = Average of training errors of M’, M’’,
M’’’, … on the training set mini-batches Validation error at epoch
N = Validation error of model M_N on the validation set Hence the
estimated training error you get is somewhere in between the
training error of model M_{N-1} and model M_N, whereas the
validation error is for model M_N. Since M_N should be better than
M_{N-1}, then the validation error might be smaller than this
estimate (but won’t when N is large as models change little and
overfitting dominates). Note that you could the “proper" training
error of M_N after each epoch, but that would be expensive (as it
would require freezing M_N and passing all the training data again)
and not worth it in practice.
&二、如何利用自己的数据在现有模型上微调(fine-tune)
& & 关于这部分内容准备分两部分来写,一是如何修改现有模型去初始化自己的网络;二是模型微调过程中需要注意的一些问题。
&1、如何修改现有模型
&由于我们的数据类别可能和训练模型的数据类别不一致,因此修改现有模型时通常只需要修改网络的最后两层(fully-connected
层 和 loss层)即可,代码(一个例子)如下:
net.layers=net.layers(1:end-2);
net.layers{end+1} = struct('type', 'conv',
'weights', {{randn(1,1,input,output, 'single'),
zeros(1,output,'single')}}, ...
'learningRate', 0.1*lr, 'stride', 1, 'pad', 0)
net.layers{end+1} = struct('type',
'softmaxloss') ;
其中input是上一个全连接层的维数,output是自己数据的类别数。
注意:如果原模型在训练时全连接层后加了dropout层,在fine-tune时最好也加上这些层,更有利于收敛
& & 2、需要注意的问题
按上面的方法修改好模型后,我们需要的网络结构就确定了。但是在微调过程中需要主要一些问题:
(1) 关于learning rate(lr)的问题。
&这里lr可以分为整体lr和每个卷积层单独的lr。
&在MatConvNet提供的example中整体lr有两种设置方法:一是设置一个固定值,然后每个epoch都用同一个lr(mnist
example用的这种);二是根据设置的epoch数目,预先设置好每个epoch的lr(cifar-10
example用的这种)。在设置这个学习率时,设置为原网络学习率的1/10是个不错的选择。
&每个卷积层的lr设置我觉着很关键(严格来说不是该层学习率,称为学习率系数也许更合适),对于我们修改的网络层通常需要设置较大的lr(比如[10,20])以保证重新训练时候的收敛速度,而对于我们没有修改的网络层,通常需要设置较小的lr(比如默认的[1
2]等)使训练速度慢,因为原先模型的权值被当作我们微调时网络的初始权值,lr较小时更容易收敛。同时,如果我们不想重新训练某些卷积层而想直接采用其原有的权值(因为前面的卷积层是比较难收敛的,训练也更麻烦),只需要将该层的lr设置为[0,0]即可,当训练样本不多时,这样很重要。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。matconvnet(30)
matlab(55)
之前用了比较简单的DeepLearningtoolbox工具包,为了深入把所有的m文件解析了一次。换到MatConvNet,发现它比前者要“庞大”很多,之前写了几篇解析就写不下去了;但MatConvNet基本的层层调用关系,和DeepLearningtoolbox还是很相似的,如果能先跑一个我们自己的例子,再来分析层级结构,有些东西理解起来就会快很多吧。。
&–在这里下载我们这次实验需要的数据,下载后解压,文件结构是这样的,
每个文件夹下存放对应的图片,然后我们在自己的MatConvNet/examples下建立一个我们自己的例子,我这里取名为myplate,里面有这么几个文件,接下来我们进行一一解析,
首先是新建cnn_plate_setup.m文件
,读取相应的图片和标签,并且减去均值。
function imdb =cnn_plate_setup_data(datadir)
inputSize =[20,20,1];
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)
imgfiles=dir(fullfile(datadir,subdir(i).name));
imgpercategory_count=length(imgfiles)-2;
disp([i-2 imgpercategory_count]);
image_counter=image_counter+imgpercategory_
这里做一个解释,之所以要从3开始,是因为试了下length(subdir)结果是67,而我们的文件夹里的总个数是65,所以应该是把前两个去掉了。(到这里我觉得有必要补习matlab中结构体的知识。)
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
imdb.images.set(end+1)=3
dataMean=mean(imdb.images.data,4)
imdb.images.data = single(bsxfun(@minus,imdb.images.data, dataMean))
imdb.images.data_mean = dataMean
这一部分是把输入图像做一些处理,因为trainratio=0.8,所以在80%之前的被用作训练集,set为1,后面是测试,set设置为3。(刚刚入手matconvnet,有很多都是自己的理解,有错误的地方欢迎指出,大家一起进步哈)同时这里进行了一个计算均值的操作。
接下来在cnn_plate_init.m中设计网络结构
function net =cnn_plate_init()
rng('default');
net.layers = {};
net.layers{end+1} = struct('type', 'conv', ...
'weights', {{f*randn(3,3,1,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', 'relu') ;
net.layers{end+1} = struct('type', 'conv', ...
'weights', {{f*randn(3,3,20,100, 'single'),zeros(1,100,'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', 'relu') ;
net.layers{end+1} = struct('type', 'conv', ...
'weights', {{f*randn(3,3,100,1000, 'single'),zeros(1,1000,'single')}}, ...
'stride', 1, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'softmaxloss') ;
% Meta parameters
net.meta.inputSize = [20 20 1] ;
net.meta.trainOpts.learningRate = logspace(-3, -5, 100);
net.meta.trainOpts.numEpochs = 50 ;
net.meta.trainOpts.batchSize = 1000 ;
% Fill in defaul values
net = vl_simplenn_tidy(net) ;
这个文件一目了然,是用来设计网络结构的,开头的rng(‘default’)是恢复matlab启动时默认的全局随机流,至于rng函数,用来保证每次生成的随机变量是一致的。这里设计的结构是conv1-&pool1-&relu-&conv2-&pool2-&relu-&conv3-&softmax
其中conv1的参数设置为20个3*3大小的卷积核,偏置为20个0,步长为1,没有补零,后面的层可以一一分析。
网络结构的设计要特别小心,不行的话就多调几个试一试。
最后是一个cnn_plate()文件把这些串联起来进行训练
function [net, info] = cnn_plate()
run(fullfile(fileparts(mfilename('fullpath')),...
'..', '..', 'matlab', 'vl_setupnn.m')) ;
datadir='F:\resources\train\ann';%这里放自己的数据路径
opts.expDir = fullfile(vl_rootnn, 'data', 'plate-baseline') ;
opts.imdbPath = fullfile(opts.expDir, 'imdb.mat');
if exist(opts.imdbPath,'file')
imdb=load(opts.imdbPath);
imdb=cnn_plate_setup_data(datadir);
mkdir(opts.expDir) ;
save(opts.imdbPath, '-struct', 'imdb') ;
net=cnn_plate_init();
net.meta.normalization.averageImage =imdb.images.data_
opts.train.gpus=?;%这里注意,根据自己用CPU还是GPU做相应修改,不然会出错
[net, info] = cnn_train(net, imdb, getBatch(opts), ...
'expDir', opts.expDir, ...
net.meta.trainOpts, ...
opts.train, ...
'val', find(imdb.images.set == 3)) ;
function fn = getBatch(opts)
% --------------------------------------------------------------------
fn = @(x,y) getSimpleNNBatch(x,y) ;
function [images, labels] = getSimpleNNBatch(imdb, batch)
images = imdb.images.data(:,:,:,batch) ;
labels = imdb.images.labels(1,batch) ;
if opts.train.gpus & 0
images = gpuArray(images) ;
然后就是训练过程,放几张截图:
训练好之后,我们就自己写一个test来识别下吧,
run(fullfile(fileparts(mfilename('fullpath')),...
'..', '..', 'matlab', 'vl_setupnn.m')) ;
addpath F:\matconvnet-master\data\plate-
datadir='F:\resources\train\ann';
class=50;index=1;
subdir=dir(datadir);
imgfiles=dir(fullfile(datadir,subdir(class+2).name));
img=imread(fullfile(datadir,subdir(class+2).name,imgfiles(index+2).name));
imshow(img);
net=load('net-epoch-50.mat');%取出我们的最终训练模型,这里只训练了50次
im_=single(img);
im_=imresize(im_,net.meta.inputSize(1:2));
im_=im_ - net.meta.normalization.averageI
opts.batchNormalization =
net.layers{end}.type = 'softmax';
res=vl_simplenn(net,im_);
scores=squeeze(gather(res(end).x));
[bestScore,best]=max(scores);
disp([subdir(best+2).name ' ' bestScore]);
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:35017次
积分:1146
积分:1146
排名:千里之外
原创:69篇
转载:18篇
译文:15篇
评论:39条
(1)(4)(17)(2)(15)(59)(3)(1)深度学习12:能力提升, 一步一步的介绍如何自己构建网络和训练,利用MatConvNet
深度学习12:能力提升, 一步一步的介绍如何自己构建网络和训练,利用MatConvNet
深度学习(Deep Learning)
本文为原创文章转载必须注明本文出处以及附上&本文地址超链接&&以及&博主博客地址:/qq_&&和&作者邮箱(
(如果喜欢本文,欢迎大家关注我的博客或者动手点个赞,有需要可以邮件联系我)
在上一篇文章中我们已经介绍了自带的cifar-10的code。下面我将非常详细的一步一步的介绍如何训练自己的数据。
前期工作:下载安装matlab和下载MatConvNet以及下载GPU相关文件和配置GPU。
具体请参见我之前的文章:
准备工作:
1. 打开Matlab,配置相关文件的路径()
2. 输入 mex -setup cpp
3. 输入 vl_compilenn
4. 输入 compileGPU
没有报错则配置完成。
开始,新建编辑页 cnn_cifar_my :
这是外层调参和构建imdb结构体的code。
关于调参我会在后面单取一篇来介绍。
函数相互调用顺序:主函数&function [net, info] = cnn_cifar_my(varargin) :
1. 首先初始化网络如下:
opts.batchNormalization =
%选择batchNormalization的真假
opts.network = [] ;
%初始化一个网络
opts.networkType = 'simplenn' ;
%选择网络结构 %%% simplenn %%% dagnn
[opts, varargin] = vl_argparse(opts, varargin) ;
%调用vl_argparse函数
sfx = opts.networkT
%sfx=simplenn
if opts.batchNormalization, sfx = [sfx '-bnorm'] ; end
%这里条件为假
opts.expDir = fullfile(vl_rootnn, 'data', ['cifar10-' sfx]) ;
%选择数据存放的路径:data\cifar-baseline-simplenn
[opts, varargin] = vl_argparse(opts, varargin) ;
%调用vl_argparse函数
opts.dataDir = fullfile(vl_rootnn, 'data', 'cifar10') ;
%选择数据读取的路径:data\matconvnet-1.0-beta23\data\cifar
opts.imdbPath = fullfile(opts.expDir, 'imdb.mat');
%选择imdb结构体的路径:data\data\cifar-baseline-simplenn\imdb
opts.whitenData =
opts.contrastNormalization =
opts.train = struct() ;
%选择训练集返回为struct型
opts = vl_argparse(opts, varargin) ;
%调用vl_argparse函数
%选择是否使用GPU,使用opts.train.gpus = 1,不使用:opts.train.gpus = []。
%有关GPU的安装配置请看我的博客:http://blog.csdn.net/qq_/article/details/
if ~isfield(opts.train, 'gpus'), opts.train.gpus = [1];
2. 调用网络结构函数 cnn_cifar_init_my (这个函数用于构造自己的网络结构) :
if isempty(opts.network)
%如果原网络为空:
net = cnn_cifar_init_my('batchNormalization', opts.batchNormalization, ...
则调用cnn_cifat_init网络结构
'networkType', opts.networkType) ;
net = opts.
使用上面选择的数值带入现有网络
opts.network = [] ;
3. 接下来将调用得到imdb的相关函数(用于训练的数据集):
if exist(opts.imdbPath, 'file')
%如果cifar中存在imdb的结构体:
imdb = load(opts.imdbPath) ;
imdb = getMnistImdb(opts) ;
调用getMnistImdb函数得到imdb并保存
mkdir(opts.expDir) ;
save(opts.imdbPath, '-struct', 'imdb') ;
end%arrayfun函数通过应用sprintf函数得到array中从1到10的元素并且将其数字标签转化为char文字型
net.meta.classes.name = arrayfun(@(x)sprintf('%d',x),1:10,'UniformOutput',false) ;
4. 然后调用网络类型(simplenn,dagnn):
switch opts.networkType
%选择网络类型:
case 'simplenn', trainfn = @cnn_
1.simplenn
case 'dagnn', trainfn = @cnn_train_
%调用训练函数,开始训练:find(imdb.images.set == 3)为验证集的样本
[net, info] = trainfn(net, imdb, getBatch(opts), ...
'expDir', opts.expDir, ...
net.meta.trainOpts, ...
opts.train, ...
'val', find(imdb.images.set == 3)) ;
综上所述,我们的流程是:1. 输入网络和参数的初始&#20540;。2. 构建训练网络结构。3. 建立训练数据集。4. 选择训练网络的类型。
imdb结构体:
1. 这是用于cnn_train中的结构体,也就是实际训练的部分。
2. 该结构体内共有4个部分,由data,label,set,class组成。
& data:包含了train data和test data。
& label:包含了train label和test label。
& set:set的个数个label的个数是相等的,set=1表示这个数据是train data,set=3则表示这个数据是test data。 & 以此方法用于计算机自己判断的标准。
& class:于数据中的class完全一样。
3. imdb构造时遵循train在上层,test在下层的顺序。
4. 相关的data需要进行泛化处理。
下面以我自己的数据为例构建一个自己的imdb:
function imdb = getMnistImdb(opts)
%% --------------------------------------------------------------
函数名:getMnistImdb
1.从mnist数据集中获取data
2.将得到的数据减去mean值
3.将处理后的数据存放如imdb结构中
% ------------------------------------------------------------------------
% Preapre the imdb structure, returns image data with mean image subtracted
load('TR.mat');
load('TT.mat');
load('TRL.mat');
load('TTL.mat');
%set = 1 对应训练;set = 3 对应的是测试
set = [ones(1,numel(y1)) 3*ones(1,numel(y2))];
%numel返回元素的总数
data = single(reshape(cat(3, x1, x2),128,256,1,[]));
%将x1的训练数据集和x2的测试数据集的第三个维度进行拼接组成新的数据集,并且转为single型减少内存
dataMean = mean(data(:,:,:,set == 1), 4);
%求出训练数据集中所有的图像的均值
data = bsxfun(@minus, data, dataMean) ;
%利用bsxfun函数将数据集中的每个元素逐个减去均值
%将数据存入imdb结构中
imdb.images.data =
%data的大小为[128 256 1 70000]。 () 这里主要看上面的data的size。
imdb.images.data_mean = dataM
%dataMean的大小为[128 256]
imdb.images.labels = cat(2, y1', y2') ;
%拼接训练数据集和测试数据集的标签,拼接后的大小为[1 70000]
imdb.images.set =
%set的大小为[1 70000],unique(set) = [1 3]
imdb.meta.sets = {'train', 'val', 'test'} ;
%imdb.meta.sets=1用于训练,imdb.meta.sets=2用于验证,imdb.meta.sets=3用于测试
%arrayfun函数通过应用sprintf函数得到array中从0到9的元素并且将其数字标签转化为char文字型
imdb.meta.classes = arrayfun(@(x)sprintf('%d',x),0:9,'uniformoutput',false) ;
1.&data = single(reshape(cat(3, x1, x2),128,256,1,[])); &这里[128,256,1]是我的数据的size。如果你是三维的数据,比如是cifar则需要将这里的1变为3。且cat的3需要变为4。
2. 针对三维数据切勿轻易使用reshape函数,尽可能的用cat函数组建,因为reshape是基于纵向来构造的。
下面我将为大家介绍如何构建自己的网络:
1. Conv.layer:
net.layers{end+1} = struct('type', 'conv', ...
%卷积层C,randn函数产生4维标准正态分布矩阵,设置偏置有20个
'weights', {{0.05*randn(3,3,1,32, 'single'), ...
zeros(1, 32, 'single')}}, ...
%filter大小是3*3*1
'learningRate', lr, ...
'stride', 1, ...
%stride = 1
'pad', 0) ;
一、weights既是filter。这里的3*3为filter的大小(长和宽),1是input的图片的厚度(如果图片是rgb则这里将是3),32是此层filter的个数。
二、stride等于该filter的移动步伐。
三、当filter的size等于1*1的时候,表示为fully connection.
2. Rule.layer:
net.layers{end+1} = struct('type', 'relu') ;
3. maxPooling.layer:
net.layers{end+1} = struct('type', 'pool', ...
'method', 'max', ...
'pool', [2 2], ...
%池化核大小为2*2
'stride', 2, ...
'pad', 0) ;
4. dropout.layer:
net.layers{end+1} = struct('type', 'dropout', 'name', 'dropout2', 'rate', 0.5) ;注:这里我们给的drop rate 是0.5 。
5. softmax.layer:
net.layers{end+1} = struct('type', 'softmaxloss') ;
%softmax层
下面我将说明网络构建的思路:
1. 一般来说作为最原始的lenet的网络结构,我们最好的构造是C-R-C-R-P为一个block。
2. C层之后一定要加上R层,这是构建原理之一,linear的C加上nonlinear的R,相信学过NN的或者能用的这个人都会知道吧。
3. softmax的input必须为1*1的size。为了实现这个就必须计算整体网络的构造,我的建议是画图,自己先在纸上画好自己的网络结构,计算好最后为1*1。
4. 关于图片缩小的计算公式:
一、Conv.layer: [(N-F)/stride]&#43;1
& &这里N是input的size,F是filter的size。
二、Pooling.layer: 一般说来pooling层是不用改变的,都是缩小2分之1。
5. 如果data的size过小,而希望增加C层来进行深度的网络构造,那么我们就需要用到padding。
& 公式:padding size = (F-stride)/2 这里F是filter的size。这样我们的C层就不会减小图片,从而进行构造深度网络。
关于网络参数的设置和调整我将在后面为大家介绍。虽然说了很多但是还是不能说尽所有。
本文为原创文章转载必须注明本文出处以及附上&本文地址超链接&&以及&博主博客地址:/qq_&&和&作者邮箱(
(如果喜欢本文,欢迎大家关注我的博客或者动手点个赞,有需要可以邮件联系我)
我的热门文章
即使是一小步也想与你分享4266人阅读
机器学习(6)
尝试过从Matconvnet官网上下载的已经训练好的神经网络之后,最近自己训练了能够识别果树上红苹果的神经网络。先上图。源代码放在
10/21/2016 更新:把滑动窗的代码放到了github上(结尾为**slide)
下面分享一下经验。
以下内容看之前,希望已经阅读过Matconvnet的官方文档,或者对机器学习的一些概念、卷积神经网络的原理具备基本的了解。
现在进入正题。
构建自己的神经网络,需要完成以下三个部分:
1.准备数据。
2.设计神经网络的结构。
3.设置参数,用数据训练网络。
一、准备数据。
数据在磁盘中的存放如下图:
之后,将文件中的图片导入、&#26684;式化、划分训练集测试集交叉验证集、求均&#20540;,然后以.mat&#26684;式存储在磁盘上。
%cnn_setup_data.m
&span style=&font-size:14&&function imdb =cnn_setup_data(datadir)
inputSize =[64,64];
subdir=dir(datadir);
imdb.images.data=[];
imdb.images.labels=[];
imdb.images.set = [] ;
imdb.meta.sets = {&#39;train&#39;, &#39;val&#39;, &#39;test&#39;} ;
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_
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;
imdb.images.set(end+1)=3;
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:14&&function net = cnn_mnist_init(varargin)
% CNN_MNIST_LENET Initialize a CNN similar for MNIST
opts.batchNormalization =
opts.networkType = &#39;simplenn&#39; ;
opts = vl_argparse(opts, varargin) ;
rng(&#39;default&#39;);
net.layers = {} ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;conv&#39;, ...
&#39;weights&#39;, {{f*randn(5,5,3,20, &#39;single&#39;), zeros(1, 20, &#39;single&#39;)}}, ...
&#39;stride&#39;, 1, ...
&#39;pad&#39;, 0) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;pool&#39;, ...
&#39;method&#39;, &#39;max&#39;, ...
&#39;pool&#39;, [2 2], ...
&#39;stride&#39;, 2, ...
&#39;pad&#39;, 0) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;conv&#39;, ...
&#39;weights&#39;, {{f*randn(10,10,20,50, &#39;single&#39;),zeros(1,50,&#39;single&#39;)}}, ...
&#39;stride&#39;, 1, ...
&#39;pad&#39;, 0) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;pool&#39;, ...
&#39;method&#39;, &#39;max&#39;, ...
&#39;pool&#39;, [2 2], ...
&#39;stride&#39;, 2, ...
&#39;pad&#39;, 0) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;conv&#39;, ...
&#39;weights&#39;, {{f*randn(10,10,50,500, &#39;single&#39;),
zeros(1,500,&#39;single&#39;)}}, ...
&#39;stride&#39;, 1, ...
&#39;pad&#39;, 0) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;relu&#39;) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;conv&#39;, ...
&#39;weights&#39;, {{f*randn(1,1,500,4, &#39;single&#39;), zeros(1,4,&#39;single&#39;)}}, ...
&#39;stride&#39;, 1, ...
&#39;pad&#39;, 0) ;
net.layers{end+1} = struct(&#39;type&#39;, &#39;softmaxloss&#39;) ;
% optionally switch to batch normalization
if opts.batchNormalization
net = insertBnorm(net, 1) ;
net = insertBnorm(net, 4) ;
net = insertBnorm(net, 7) ;
% 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 &#39;simplenn&#39;
case &#39;dagnn&#39;
net = dagnn.DagNN.fromSimpleNN(net, &#39;canonicalNames&#39;, true) ;
net.addLayer(&#39;top1err&#39;, dagnn.Loss(&#39;loss&#39;, &#39;classerror&#39;), ...
{&#39;prediction&#39;, &#39;label&#39;}, &#39;error&#39;) ;
net.addLayer(&#39;top5err&#39;, dagnn.Loss(&#39;loss&#39;, &#39;topkerror&#39;, ...
&#39;opts&#39;, {&#39;topk&#39;, 5}), {&#39;prediction&#39;, &#39;label&#39;}, &#39;top5err&#39;) ;
assert(false) ;
% --------------------------------------------------------------------
function net = insertBnorm(net, l)
% --------------------------------------------------------------------
assert(isfield(net.layers{l}, &#39;weights&#39;));
ndim = size(net.layers{l}.weights{1}, 4);
layer = struct(&#39;type&#39;, &#39;bnorm&#39;, ...
&#39;weights&#39;, {{ones(ndim, 1, &#39;single&#39;), zeros(ndim, 1, &#39;single&#39;)}}, ...
&#39;learningRate&#39;, [1 1 0.05], ...
&#39;weightDecay&#39;, [0 0]) ;
net.layers{l}.biases = [] ;
net.layers = horzcat(net.layers(1:l), layer, net.layers(l+1:end)) ;&/span&&span style=&font-size:18&&
&/span&该网络结构:
三、训练网络
%cnn_mnist.m
&span style=&font-size:14&&function [net, info] = cnn_mnist(varargin)
%CNN_MNIST
Demonstrates MatConvNet on MNIST
run(fullfile(fileparts(mfilename(&#39;fullpath&#39;)),...
&#39;..&#39;, &#39;..&#39;, &#39;matlab&#39;, &#39;vl_setupnn.m&#39;)) ;
opts.batchNormalization =
opts.networkType = &#39;simplenn&#39; ;
[opts, varargin] = vl_argparse(opts, varargin) ;
sfx = opts.networkT
if opts.batchNormalization, sfx = [sfx &#39;-bnorm&#39;] ; end
datadir=&#39;E:\学习\机器学习\matconvnet-1.0-beta20\photos\multi-label&#39;;
opts.expDir = fullfile(vl_rootnn, &#39;data&#39;, [&#39;mnist-zyp-&#39; sfx]) ;
[opts, varargin] = vl_argparse(opts, varargin) ;
opts.dataDir = fullfile(vl_rootnn, &#39;data&#39;, &#39;mnist&#39;) ;
opts.imdbPath = fullfile(opts.expDir, &#39;imdb.mat&#39;);
opts.train = struct() ;
opts = vl_argparse(opts, varargin) ;
if ~isfield(opts.train, &#39;gpus&#39;), opts.train.gpus = [];
% --------------------------------------------------------------------
Prepare data
% --------------------------------------------------------------------
net = cnn_mnist_init(&#39;batchNormalization&#39;, opts.batchNormalization, ...
&#39;networkType&#39;, opts.networkType) ;
if exist(opts.imdbPath, &#39;file&#39;)
imdb = load(opts.imdbPath) ;
imdb=cnn_setup_data(datadir);
mkdir(opts.expDir) ;
save(opts.imdbPath, &#39;-struct&#39;, &#39;imdb&#39;) ;
net.meta.classes.name = arrayfun(@(x)sprintf(&#39;%d&#39;,x),1:2,&#39;UniformOutput&#39;,false) ;
% --------------------------------------------------------------------
% --------------------------------------------------------------------
switch opts.networkType
case &#39;simplenn&#39;, trainfn = @cnn_
case &#39;dagnn&#39;, trainfn = @cnn_train_
[net, info] = trainfn(net, imdb, getBatch(opts), ...
&#39;expDir&#39;, opts.expDir, ...
net.meta.trainOpts, ...
opts.train, ...
&#39;val&#39;, find(imdb.images.set == 3)) ;
net.meta.data_mean = imdb.images.data_
net.layers{end}.class = [1] ;
% --------------------------------------------------------------------
function fn = getBatch(opts)
% --------------------------------------------------------------------
switch lower(opts.networkType)
case &#39;simplenn&#39;
fn = @(x,y) getSimpleNNBatch(x,y) ;
case &#39;dagnn&#39;
bopts = struct(&#39;numGpus&#39;, numel(opts.train.gpus)) ;
fn = @(x,y) getDagNNBatch(bopts,x,y) ;
% --------------------------------------------------------------------
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) ;
inputs = {&#39;input&#39;, images, &#39;label&#39;, labels} ;&/span&&span style=&font-size:18&&
四、应用——测试程序
&span style=&font-size:14&&%初次运行一次,之后不再运行
%[net_bn, info_bn] = cnn_mnist(&#39;batchNormalization&#39;, true);
load(&#39;E:\学习\机器学习\matconvnet-1.0-beta20\data\mnist-zyp-simplenn-bnorm\imdb.mat&#39;);
im=imread(&#39;E:\学习\机器学习\matconvnet-1.0-beta20\photos\QQ截图45.png&#39;);
im=imresize(im,[64 64 ]);
imshow(im);
im = single(im);
im = im - images.data_
res = vl_simplenn(net_bn, im,[],[],...
&#39;accumulate&#39;, 0, ...
&#39;mode&#39;, &#39;test&#39;, ...
&#39;backPropDepth&#39;, inf, ...
&#39;sync&#39;, 0, ...
&#39;cudnn&#39;, 1) ;
scores = res(11).x(1,1,:);
[bestScore, best] = max(scores);
switch best
title(&#39;判断结果:不是苹果&#39;);
title(&#39;判断结果:1个苹果&#39;);
title(&#39;判断结果:2个苹果&#39;);
title(&#39;判断结果:3个苹果&#39;);
end&/span&&span style=&font-size:18&&
&/span&测试一下:
PS:写着写着就懒得写注释了。
配合滑动窗的话,结果如下:
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13654次
排名:千里之外
原创:17篇
评论:69条
(1)(1)(2)(15)(1)(3)}

我要回帖

更多关于 goldie的意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信