matconnet怎么训练mnist alexnet

16被浏览2282分享邀请回答1添加评论分享收藏感谢收起01 条评论分享收藏感谢收起查看更多回答深度学习(十三):Matconvnet详解与实验手写体数据库 - CSDN博客
深度学习(十三):Matconvnet详解与实验手写体数据库
手写体数据库是一个简单通用的模型,这是进一步理解像imagenet的cnn模型的基础模型。
关于手写体,输入的大小就是28*28的黑白二像素图像,比较简单,ok现在开始操作。
Matconvnet自带集成mnist这个实例库,数据集的下载都帮集成了,我们只需要去确认工具箱可以用,然后直接运行就可以了。
打开安装文件夹以后打开如下函数:
首先将整个安装包添加路径,然后直接运行就可以了。等一段时间后(训练20代,大概10多分钟),训练完成了,结果都存在上面那个文件夹的data里面,像下面这样:
训练的效果如图:
这样也只能看出结果收敛的好,但是具体准确率多少呢?后面介绍。
好了下面再开看看这个网络构造,自己去cnn_mnist_init这个函数就可以发现模型结构了。
贴一个解释:
可以自己去看代码,就不解释了。这里假设代码看懂了,那么我抽象出来这个模型结构就像下面这样:
可以这个模型的结构依次为:输入-卷积1-pool1-卷积2-pool2-卷积2-relu-卷积4(也可以是全连接层)-sofrmax分类。
根据代码中的结构定义,我们也可以推算出每一层的输出大小(上述图)。
这里需要注意的是,这个网络层的设计大小一定要吻合。比如,经过一系列的卷积pool后,到全连接层时,输入一定要是1*1*X*X,且上一层的map,和下一层的卷积数map一定要一样。比如输入为28*28*1,那么第一个卷积核是5*5*1*20,这个1就是上一层的只有一个图。再往下走卷积为5*5*20*50,这里为什么是20,因为上一层的map有20个。一次类推,计算到最后正好为1*1*500,这样才可以全连接层。如果你自己设计网络,自己计算一下一定要保证后面全连接层时输入为1*1*X*X,否则会训练错误。
Ok,这里说到这,下面在更直观看下网上别人分享的一个网络(当然输入大小错了,中间大小也错了,但是结构类似)
好了,模型训练完了,那么怎么测试呢?
这个数据集本身也分了训练集与测试集,下面我们来测试一下测试集的准确率。建一个m脚本,函数如下:
load('D:\myself\matlab\matlab_documents\matconvnet_test\matconvnet\data\mnist-baseline-simplenn\imdb.mat');
test_index = find(images.set==3);
test_data = images.data(:,:,:,test_index);
test_label = images.labels(test_index);
load('D:\myself\matlab\matlab_documents\matconvnet_test\matconvnet\data\mnist-baseline-simplenn\net-epoch-20.mat');
net.layers{1, end}.type = 'softmax';
for i = 1:length(test_label)
im_ = test_data(:,:,:,i);
im_ = im_ - images.data_
res = vl_simplenn(net, im_) ;
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
accurcy = length(find(pre==test_label))/length(test_label);
disp(['accurcy = ',num2str(accurcy*100),'%']);
解释一下,中间有一块需要改变最后一层的名字变为softmax,这样才是测试用的。
测试样本可以看到为10000,这样运行一下结果如下:
accurcy = 96.97%
可见准确率还是挺高的。在这个序列的前几篇,曾经也用另外一个深度学习工具箱做过mnist的实验(感兴趣可以去看)
在那里用的是自编码以及pca等方法,都不能得到像现在这样的准确率。
进一步索引对网上大牛对Matconvnet中一些函数的详细解释:
注释详细至极,同时这个网站的众多好资源,表示感谢。
最后分享一个网上将这个代码转变为c++代码的测试方法,觉得很好。
本文已收录于以下专栏:
相关文章推荐
上节讨论过如何使一个简单的cnn网络训练mnist数据集,该节介绍复杂并且使用广泛的使用imagenet网络的预训练模型训练自己的数据集。Ok首先是自己的数据集了。Matconvnet中训练image...
本文的代码来自MatConvNet
  下面是自己对代码的注释:  
cnn_mnist_init.mfunction net = cnn_mnist_init(varargin)
开始害怕看那像表一样的电话,因为那样我会觉得被整个世界遗忘.    开始害怕所有的心疼和关心连一句简单的问候都换不回来,因为我会觉得那样会很贱.     开始害怕翻看手机里的电话本,因为我连一个可以聊...
全连接层(对上一层的神经元进行全部连接,实现特征的非线性组合)
keras.layers.core.Dense(units, activation=None, use_bias=...
★抽奖腾讯备案电话【↘↘7551】抽 奖 二 线【↘↘7551】活 动 热 线【↘↘7551】 幸 运 用 户 必 须 遵 守 领 奖 程 序 办...
现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri、Google Now、Amazon Alexa、微软小冰等等。前不久有一个视频比较了Google
该节简单介绍一下如何使用Matconvnet的现有的模型进行图像分类实验以及提取图像对应层的特征。先来看看如何用训练好的imagenet网络模型进行图像的预测,英文版的官网教程就在这里:http://...
最近几个月为了写小论文,题目是关于用深度学习做人脸检索的,所以需要选择一款合适的深度学习框架,caffe我学完以后感觉使用不是很方便,之后有人向我推荐了Keras,其简单的风格吸引了我,之后的四个月我...
前言一晃一个月没写博客了。懒癌又犯了TT。
之前提到过,写博客是为了记录实习中学到的点滴。博主在某家做travelling IT solution的公司实习。公司核心业务还是做Global Dist...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)深度学习(十四):详解Matconvnet使用imagenet模型训练自己的数据集
上节讨论过如何使一个简单的cnn网络训练mnist数据集,该节介绍复杂并且使用广泛的使用imagenet网络的预训练模型训练自己的数据集。
Ok首先是自己的数据集了。Matconvnet中训练imagenet的数据集的准备不像caffe这些工具箱弄得那么好,弄个train文件夹,test文件夹,以及两个txt索引就好了,感觉很不人性。后面我将会将其输入改为这种人性的类型输入格式。
但是其类别索引是从0开始的,这在matlab中是不符合的,所以我将其改成从1开始的。同时添加了一个类class标签的txt,改完的
下载完打开这个文件夹看到:
其中train就是训练所用到的所有图片,test为测试所有图片,train_label为对应图片的名字以及跟随的类标签(从1开始),打开txt可以看到为:
这种格式的txt相信应该很容易从你自己的数据集中弄到。依次类推,test.txt中存放的是test文件夹所有图片的名字以及其类别。
Classind 就是每一类表示的分类的名字。
数据准备好了,放在哪呢?我们在Matconvnet的工具箱目录下新建一个文件夹为data,然后将这个数据集放进去,如下:
我们是在训练好的model上继续训练,所以需要一个model,再在这文件夹下建立一个models文件夹,然后把imagenet-vgg-f.mat放入到models里面。这里我们使用的是vgg-f的model,这个model在前两节说到了,自己去下载。
接着就是网络训练了。再建立一个文件夹train,可以编写函数了。
首先是主函数:
这里复制一下examples中的imagenet里面的一个主函数cnn_dicnn,然后修改一下里面的路径,程序为:
function [net, info] = cnn_dicnn(varargin)
%CNN_DICNN Demonstrates fine-tuning a pre-trained CNN on imagenet dataset
run(fullfile(fileparts(mfilename('fullpath')), ...
'..', 'matconvnet', 'matlab', 'vl_setupnn.m')) ;
% 修改读入文件夹的路径
opts.dataDir = fullfile('data','image') ;
opts.expDir
= fullfile('exp', 'image') ;
% 导入预训练的model
opts.modelPath = fullfile('models','imagenet-vgg-f.mat');
[opts, varargin] = vl_argparse(opts, varargin) ;
opts.numFetchThreads = 12 ;
opts.lite =
opts.imdbPath = fullfile(opts.expDir, 'imdb.mat');
opts.train = struct() ;
opts.train.gpus = [];
opts.train.batchSize = 8 ;
opts.train.numSubBatches = 4 ;
opts.train.learningRate = 1e-4 * [ones(1,10), 0.1*ones(1,5)];
opts = vl_argparse(opts, varargin) ;
if ~isfield(opts.train, 'gpus'), opts.train.gpus = [];
% -------------------------------------------------------------------------
Prepare model
% -------------------------------------------------------------------------
net = load(opts.modelPath);
% 修改一下这个model
net = prepareDINet(net,opts);
% -------------------------------------------------------------------------
Prepare data
% -------------------------------------------------------------------------
% 准备数据格式
if exist(opts.imdbPath,'file')
imdb = load(opts.imdbPath) ;
imdb = cnn_image_setup_data('dataDir', opts.dataDir, 'lite', opts.lite) ;
mkdir(opts.expDir) ;
save(opts.imdbPath, '-struct', 'imdb') ;
imdb.images.set = imdb.images.
% Set the class names in the network
net.meta.classes.name = imdb.classes.
net.meta.classes.description = imdb.classes.
% % 求训练集的均值
imageStatsPath = fullfile(opts.expDir, 'imageStats.mat') ;
if exist(imageStatsPath)
load(imageStatsPath, 'averageImage') ;
averageImage = getImageStats(opts, net.meta, imdb) ;
save(imageStatsPath, 'averageImage') ;
% % 用新的均值改变均值
net.meta.normalization.averageImage = averageI
% -------------------------------------------------------------------------
% -------------------------------------------------------------------------
% 索引训练集==1
和测试集==3
opts.train.train = find(imdb.images.set==1) ;
opts.train.val = find(imdb.images.set==3) ;
[net, info] = cnn_train_dag(net, imdb, getBatchFn(opts, net.meta), ...
'expDir', opts.expDir, ...
opts.train) ;
% -------------------------------------------------------------------------
% -------------------------------------------------------------------------
% 保存训练完的网络
net = cnn_imagenet_deploy(net) ;
modelPath = fullfile(opts.expDir, 'net-deployed.mat');
net_ = net.saveobj() ;
save(modelPath, '-struct', 'net_') ;
clear net_ ;
% -------------------------------------------------------------------------
function fn = getBatchFn(opts, meta)
% -------------------------------------------------------------------------
useGpu = numel(opts.train.gpus) & 0 ;
bopts.numThreads = opts.numFetchT
bopts.imageSize = meta.normalization.imageS
bopts.border = meta.normalization.
% bopts.averageImage = [];
bopts.averageImage = meta.normalization.averageI
% bopts.rgbVariance = meta.augmentation.rgbV
% bopts.transformation = meta.augmentation.
fn = @(x,y) getDagNNBatch(bopts,useGpu,x,y) ;
% -------------------------------------------------------------------------
function inputs = getDagNNBatch(opts, useGpu, imdb, batch)
% -------------------------------------------------------------------------
% 判断读入数据为训练还是测试
for i = 1:length(batch)
if imdb.images.set(batch(i)) == 1 %1为训练索引文件夹
images(i) = strcat([imdb.imageDir.train filesep] , imdb.images.name(batch(i)));
images(i) = strcat([imdb.imageDir.test filesep] , imdb.images.name(batch(i)));
isVal = ~isempty(batch) && imdb.images.set(batch(1)) ~= 1 ;
% training
im = cnn_imagenet_get_batch(images, opts, ...
'prefetch', nargout == 0) ;
% validation: disable data augmentation
im = cnn_imagenet_get_batch(images, opts, ...
'prefetch', nargout == 0, ...
'transformation', 'none') ;
if nargout & 0
im = gpuArray(im) ;
labels = imdb.images.label(batch) ;
inputs = {'input', im, 'label', labels} ;
% 求训练样本的均值
% -------------------------------------------------------------------------
function averageImage = getImageStats(opts, meta, imdb)
% -------------------------------------------------------------------------
train = find(imdb.images.set == 1) ;
batch = 1:length(train);
fn = getBatchFn(opts, meta) ;
train = train(1: 100: end);
for i = 1:length(train)
temp = fn(imdb, batch(train(i):train(i)+99)) ;
temp = temp{2};
avg{end+1} = mean(temp, 4) ;
averageImage = mean(cat(4,avg{:}),4) ;
% 将GPU格式的转化为cpu格式的保存起来(如果有用GPU)
averageImage = gather(averageImage);
这里涉及到了几个函数需要自己写,其他的都有调用的。第一个函数就是数据格式的准备。Matconvnet训练是有自己的格式要求的,一般都是生成imdb结构体保存起来。下面是如何将我们这种格式的训练样本集生成要求的格式,建立一个m函数cnn_image_setup_data代码如下:
function imdb = cnn_image_setup_data(varargin)
opts.dataDir = fullfile('data','image') ;
opts.lite =
opts = vl_argparse(opts, varargin) ;
% ------------------------------------------------------------------------
Load categories metadata
% -------------------------------------------------------------------------
metaPath = fullfile(opts.dataDir, 'classInd.txt') ;
fprintf('using metadata %s\n', metaPath) ;
tmp = importdata(metaPath);
nCls = numel(tmp);
% 判断类别与设定的是否一样 10为样本的类别总数(自己的数据集需要修改)
if nCls ~= 10
error('Wrong meta file %s',metaPath);
% 将名字分离出来
cats = cell(1,nCls);
for i=1:numel(tmp)
t = strsplit(tmp{i});
cats{i} = t{2};
% 数据集文件夹选择
imdb.classes.name =
imdb.imageDir.train = fullfile(opts.dataDir, 'train') ;
imdb.imageDir.test = fullfile(opts.dataDir, 'test') ;
%% -----------------------------------------------------------------
load image names and labels
% -------------------------------------------------------------------------
name = {};
labels = {} ;
imdb.images.sets = [] ;
fprintf('searching training images ...\n') ;
% 导入训练类别标签
train_label_path = fullfile(opts.dataDir, 'train_label.txt') ;
train_label_temp = importdata(train_label_path);
temp_l = train_label_temp.
for i=1:numel(temp_l)
train_label{i} = temp_l(i);
if length(train_label) ~= length(dir(fullfile(imdb.imageDir.train, '*.jpg')))
error('training data is not equal to its label!!!');
for d = dir(fullfile(imdb.imageDir.train, '*.jpg'))'
name{end+1} = d.
labels{end+1} = train_label{i} ;
if mod(numel(name), 10) == 0, fprintf('.') ; end
if mod(numel(name), 500) == 0, fprintf('\n') ; end
imdb.images.sets(end+1) = 1;%train
fprintf('searching testing images ...\n') ;
% 导入测试类别标签
test_label_path = fullfile(opts.dataDir, 'test_label.txt') ;
test_label_temp = importdata(test_label_path);
temp_l = test_label_temp.
for i=1:numel(temp_l)
test_label{i} = temp_l(i);
if length(test_label) ~= length(dir(fullfile(imdb.imageDir.test, '*.jpg')))
error('testing data is not equal to its label!!!');
for d = dir(fullfile(imdb.imageDir.test, '*.jpg'))'
name{end+1} = d.
labels{end+1} = test_label{i} ;
if mod(numel(name), 10) == 0, fprintf('.') ; end
if mod(numel(name), 500) == 0, fprintf('\n') ; end
imdb.images.sets(end+1) = 3;%test
labels = horzcat(labels{:}) ;
imdb.images.id = 1:numel(name) ;
imdb.images.name =
imdb.images.label =
这个函数里面有几点需要注意的是,类别总数需要视自己的数据集修改。
之后是对导入的预训练model进行一点处理,建立一个函数
% -------------------------------------------------------------------------
function net = prepareDINet(net,opts)
% -------------------------------------------------------------------------
% replace fc8
fc8l = cellfun(@(a) strcmp(a.name, 'fc8'), net.layers)==1;
note: 下面这个是类别数,一定要和自己的类别数吻合(这里为10类)
nCls = 10;
sizeW = size(net.layers{fc8l}.weights{1});
% 将权重初始化
if sizeW(4)~=nCls
net.layers{fc8l}.weights = {zeros(sizeW(1),sizeW(2),sizeW(3),nCls,'single'), ...
zeros(1, nCls, 'single')};
% change loss
添加一个loss层用于训练
net.layers{end} = struct('name','loss', 'type','softmaxloss') ;
% convert to dagnn dagnn网络,还需要添加下面这几层才能训练
net = dagnn.DagNN.fromSimpleNN(net, 'canonicalNames', true) ;
net.addLayer('top1err', dagnn.Loss('loss', 'classerror'), ...
{'prediction','label'}, 'top1err') ;
net.addLayer('top5err', dagnn.Loss('loss', 'topkerror', ...
'opts', {'topK',5}), ...
{'prediction','label'}, 'top5err') ;
这里有一个重要的参数就是你的类别数nCls,还是是多少类就修改多少。
上面的几个函数都放在train文件夹下面就可以了,如下:
这里还有许多参数需要说明,一个重要的参数是迭代次数,以及是否选择使用gpu。
对于迭代次数,在cnn_dicnn函数中的训练函数cnn_train_dag
函数中,打开如下:
在训练的时候一般默认的迭代次数都会很多,还好每一代训练的结果都会保存,即使中断了,再运行的时候,程序会接着上一次的代数接着训练的。这样的一个好处是,假如你发现结果好的差不多了,又不想训练了,可以终止程序,把这个迭代次数改到目前的代数,那么下一次程序读入后发现到训练代数了。就不会在训练了,直接结束,执行下面的保存最终网络的程序过程,这一点操作还是很重要的很好用的。
对于是否需要选择gpu,这里有一个参数,同时最好也把主函数里面的gpu=[]也修改一样的,[]中填的是你的电脑gpu索引号码,比如gpu=[1],就是使用gpu 1来进行训练。
Ok做完这些操作后,就可以训练了,如果选择gpu出错了,先改成cpu试一试,要是cpu没有出错,那么就是gpu没装好。否则就是编译出错了。我实验的是我的gpu版本的matconvnet可以同时工作在cpu和GPU模式。
下面就是训练了。这个训练相对来说不算长,训练100代也就1个多小时,小的缘故。正确训练的截图:
经过一段时间训练,到达指定代数后就会停止,想让它早点停止就按照上面一个方法。停止完后,会在\matconvnet_test\exp\image文件夹下面生成一个net-deployed.mat最终的model,像我让他训练了106代就强制停止了,然后把echo迭代次数从300改成106,再运行主函数,之后就可以得到net-deployed.mat了,这里把106之间的训练结果都删除后,如下:
有了这个model,我们就可以测试了,这个model就是我们训练的最终model。
下面我们来测试,同样对这个数据集中的测试样本进行测试:写一个test_accuracy脚本,添加如下代码:
% 导入model
net1 = dagnn.DagNN.loadobj(load('D:\myself\matlab\matlab_documents\matconvnet_test\exp\image\net-deployed.mat')) ;
net1.mode = 'test' ;
% 导入准备数据
imdb = load('D:\myself\matlab\matlab_documents\matconvnet_test\exp\image\imdb.mat') ;
opts.dataDir = fullfile('data','image') ;
opts.expDir
= fullfile('exp', 'image') ;
% 找到训练与测试集
opts.train.train = find(imdb.images.sets==1) ;
opts.train.val = find(imdb.images.sets==3) ;
for i = 1:length(opts.train.val)
index = opts.train.val(i);
label = imdb.images.label(index);
% 读取测试的样本
imread(fullfile(imdb.imageDir.test,imdb.images.name{index}));
im_ = single(im_);
im_ = imresize(im_, net1.meta.normalization.imageSize(1:2)) ;
im_ = bsxfun(@minus, im_, net1.meta.normalization.averageImage) ;
net1.eval({'input',im_}) ;
scores = net1.vars(net1.getVarIndex('prob')).
scores = squeeze(gather(scores)) ;
[bestScore, best] = max(scores) ;
truth(i) =
% 计算准确率
accurcy = length(find(pre==truth))/length(truth);
disp(['accurcy = ',num2str(accurcy*100),'%']);
这样得到结果为accurcy = 89%。
如果大家看这个数据集会发现,这个简易的数据集还是很复杂的,图片都是原始搜集者在淘宝上找的,能有这样的准确率其实还算可以。
至此,使用现存的imagenet网络训练自己的数据库就到此结束了。剩下的只是修改准备自己的数据库即可了。特别需要注意的是,文件夹的名称一定要按我给的来,或者自己修改了要在程序里面去修改。其次是类别数一定记得改成自己的。注意这几点,那么使用大型的cnn训练自己的数据库就很容易了。MatConNet源代码解读(2) - qzhua3的博客 - CSDN博客
MatConNet源代码解读(2)
example/cnn_mnist.m
function [net, info] = cnn_mnist(varargin)
run(fullfile(fileparts(mfilename('fullpath')),...
'..', '..', 'matlab', 'vl_setupnn.m')) ;
opts.batchNormalization =
opts.networkType = 'simplenn' ;
[opts, varargin] = vl_argparse(opts, varargin) ;
sfx = opts.networkT
if opts.batchNormalization, sfx = [sfx '-bnorm'] ; end
opts.expDir = fullfile(vl_rootnn, 'data', ['mnist-baseline-' 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;
net = cnn_mnist_init('batchNormalization', opts.batchNormalization, ...
'networkType', opts.networkType) ;
if exist(opts.imdbPath, 'file')
imdb = load(opts.imdbPath) ;
imdb = getMnistImdb(opts) ;
mkdir(opts.expDir) ;
save(opts.imdbPath, '-struct', 'imdb') ;
net.meta.classes.name = arrayfun(@(x)sprintf('%d',x),1:10,'UniformOutput',false) ;
switch opts.networkType
case 'simplenn', trainfn = @cnn_
case 'dagnn', trainfn = @cnn_train_
[net, info] = trainfn(net, imdb, getBatch(opts), ...
'expDir', opts.expDir, ...
net.meta.trainOpts, ...
opts.train, ...
'val', find(imdb.images.set == 3)) ;
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) ;
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 = {'input', images, 'label', labels} ;
function imdb = getMnistImdb(opts)
files = {'train-images-idx3-ubyte', ...
'train-labels-idx1-ubyte', ...
't10k-images-idx3-ubyte', ...
't10k-labels-idx1-ubyte'} ;
if ~exist(opts.dataDir, 'dir')
mkdir(opts.dataDir) ;
if ~exist(fullfile(opts.dataDir, files{i}), 'file')
url = sprintf('/exdb/mnist/%s.gz',files{i}) ;
fprintf('downloading %s\n', url) ;
gunzip(url, opts.dataDir) ;
f=fopen(fullfile(opts.dataDir, 'train-images-idx3-ubyte'),'r') ;
x1=fread(f,inf,'uint8');
fclose(f) ;
x1=permute(reshape(x1(17:end),28,28,60e3),[2 1 3]) ;
f=fopen(fullfile(opts.dataDir, 't10k-images-idx3-ubyte'),'r') ;
x2=fread(f,inf,'uint8');
fclose(f) ;
x2=permute(reshape(x2(17:end),28,28,10e3),[2 1 3]) ;
f=fopen(fullfile(opts.dataDir, 'train-labels-idx1-ubyte'),'r') ;
y1=fread(f,inf,'uint8');
fclose(f) ;
y1=double(y1(9:end)')+1 ;
f=fopen(fullfile(opts.dataDir, 't10k-labels-idx1-ubyte'),'r') ;
y2=fread(f,inf,'uint8');
fclose(f) ;
y2=double(y2(9:end)')+1 ;
%训练集为1,测试集为3
set = [ones(1,numel(y1)) 3*ones(1,numel(y2))];
data = single(reshape(cat(3, x1, x2),28,28,1,[]));
dataMean = mean(data(:,:,:,set == 1), 4);
%这个函数牛逼了,可以理解为将dataMean扩展至与data同维数,然后逐点执行minus操作。实际可能分布式计算,好牛叉!
data = bsxfun(@minus, data, dataMean) ;
imdb.images.data =
imdb.images.data_mean = dataM
imdb.images.labels = cat(2, y1, y2) ;
imdb.images.set =
%最难的在这里,‘val’是什么意思一直没搞懂!
imdb.meta.sets = {'train', 'val', 'test'} ;
imdb.meta.classes = arrayfun(@(x)sprintf('%d',x),0:9,'uniformoutput',false) ;
我的热门文章}

我要回帖

更多关于 怎么看mnist的训练集 的文章

更多推荐

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

点击添加站长微信