`

MatConvNet的excise 3改为网络配置文件形式

阅读更多
MatConvNet为vlFeat作者写的matlab下的卷积神经网络工具包,可以使用GPU。
主页:http://www.vlfeat.org/matconvnet/
教程:http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.html

注意:需要下载新版的MatConvNet替换掉教程中工具包中的matconvnet:http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta12.tar.gz


本文程序和excise3效果一致,但使用了MatConvNet的examples中类似的网络结构进行定义,可以使用cnn_train函数进行训练。
内容:
  • 演示了自定义网络层、自定义误差函数的方法
  • 演示了自定义errorFunction的方法
  • 演示了对于不同参数分别设置learning rate和weight decay 的方法


不多说,上代码,注释很详细:

function LC_Ex3_usingNetStructure
clc
% -------------------------------------------------------------------------
% Part 3: Learning a simple CNN  改为了使用网络定义
% -------------------------------------------------------------------------
% 改写http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.htm  的 exercise 3为一个网络
%  注意:MatConvNet工具包已经替换为新版:http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta12.tar.gz


setup ;
%%

doSmooth=false;
subMean=false;

doSmooth=true;
subMean=true;


wSize=9;
% -------------------------------------------------------------------------
% Part 3.1: Load an example image and generate its labels
% -------------------------------------------------------------------------
%%
% Load an image
im = rgb2gray(im2single(imread('data/dots.jpg'))) ;

% Compute the location of black blobs in the image
[pos,neg] = extractBlackBlobs(im) ;

%%
% -------------------------------------------------------------------------
% Part 3.2: Image preprocessing
% -------------------------------------------------------------------------

% Pre-smooth the image
if(doSmooth)
    im = vl_imsmooth(im,3) ;
end
%%
% Subtract median value
if(subMean)
    im = im - median(im(:)) ;
end



%% Create pixel-level labels to compute the loss
y = zeros(size(pos),'single') ;
y(pos) = +1 ;
y(neg) = -1 ;


%%  转换为imdb格式

imdb.images.data = {im} ;
imdb.images.labels = {y} ; %labels的数据结构完全由自己决定,与getBatch函数以及误差层的backward函数兼容即可(在backward函数中以layer.class形式出现,layer.class等于getBatch函数的返回值labels);对于分类问题,一般为[1,1,2,2]等类别信息
imdb.images.set = [1];%  样本类型,1为训练样本,2为validation样本,3为测试样本,,但是cnn_train函数只会对训练样本和测试样本进行计算
imdb.meta.sets = {'train', 'val', 'test'} ;%集合名称,即1代表训练集,2代表val集(validation)
imdb.meta.classes ={'1'}; %类别名称




%% -------------------------------------------------------------------------
% Part 3.3: Learning with stochastic gradient descent
% -------------------------------------------------------------------------

trainOpts.batchSize = 1 ;
trainOpts.numEpochs = 500 ; %运行多少轮
trainOpts.continue = false ;%如果trainOpts.expDir已经有对应epoch的网络,是否直接载入
trainOpts.gpus=[]; %gpu下标,不使用GPU则设为[],,如果有两个GPU可以设为 [1 2]
trainOpts.learningRate =.5 ;
trainOpts.expDir = 'data/ex3-experiment' ; %输出的网络结果、实验结果图存在哪儿
trainOpts.momentum=0.9;
trainOpts.weightDecay = 0.0001 ;

trainOpts.errorFunction=@error_ErrPixels; %用于显示误差的自定义函数
trainOpts.errorLabels ={'错误率'};

net=LC_CNN_Ex3('wSize',wSize); %将pos,neg均传给网络,记录到输出层的结构中,便于根据之前的公式计算误差





trainOpts.val=   imdb.images.set==1;  %验证集下标,,必须有验证集,否则报错。。。只好把训练集当成验证集了
[net, info] = cnn_train(net, imdb, @getBatch, ...
    trainOpts) ;

end


%只有一幅图片,直接返回就行了
function  [im, labels]=getBatch(imdb,batch)
   im= imdb.images.data{1};
   im=reshape(im,[size(im) 1]);
   labels=imdb.images.labels{1};
end


%绘图用,用于检测不同epoch下网络的性能,这里返回的指标为分类错误率
function err = error_ErrPixels(opts, labels, res)
% -------------------------------------------------------------------------
resX=res(end-1).x;
y=labels;
        fp = resX >0 & y < 0 ;
        fn = resX < 1 & y > 0 ;
        tn = resX <= 0 & y < 0 ;
        tp = resX >= 1 & y > 0 ;
% err=[fp;fn;tn;tp]; %可以设置多个指标,对应的trainOpts.errorLabels 也要改为多个标签
err=100*(1-sum(sum(tp|tn))/sum(sum(fp|fn|tp|tn)));
end



function net=LC_CNN_Ex3(varargin)
% 改写http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.html  的 exercise 3为一个网络

opts.wSize=3;
opts=vl_argparse(opts,varargin);


net.layers = {} ;

lr=ones(1,10); 
weightDecay=[1 0];
w = 10 * randn(opts.wSize,opts.wSize, 1) ;  %最后一个表示输出只有一个通道
w = single(w - mean(w(:))) ;
b = single(0) ;
pad1 = ([size(w,1) size(w,1) size(w,2) size(w,2)] - 1) / 2 ;
net.layers{end+1}= struct('type', 'conv', ...
    'weights', {{w, b}}, ...
    'learningRate', [1 2], ...  %自定义learning rate相对于全局的learning rate 的比率,[1 2] 表示w的学习率与全局学习率一致,而偏置b的学习率则为全局学习率的两倍
    'weightDecay',weightDecay,...;%自定义weightDecay相对于全局的weightDecay的比率,[1 0]表示只对w矩阵进行weight decay,而不对偏置b进行weight decay
    'stride', 1, ...
    'pad', pad1) ;

rho2 = 3 ;
pad2 = (rho2 - 1) / 2 ;
net.layers{end+1}= struct('type', 'pool', ...
    'method', 'max', ...
    'pool', rho2, ...
    'stride', 1, ...
    'pad', pad2) ;



%% 自定义的误差函数层
net.layers{end+1}= struct('type', 'custom', ...
    'forward', @forwardFunc , ...  %
    'backward', @backwardFunc) ;
end


function resIp1= forwardFunc(layer, resI, resIp1)   % 计算数据项误差
pos=layer.class==1;
neg=layer.class==-1;
resIp1.x=  mean(max(0, 1 - resI.x(pos))) + ...
    mean(max(0, resI.x(neg)));
end

%后向传播,,求导;;;注意layer.class为该batch内图片的labels。
function resI = backwardFunc(layer, resI, resIp1)  %计算导数

pos=layer.class==1;
neg=layer.class==-1;
resI.dzdx=- single(resI.x < 1 & pos) / sum(pos(:)) + ...
    + single(resI.x > 0 & neg) / sum(neg(:)) ;
end
分享到:
评论

相关推荐

    ssd5 optional excise3 答案

    【SSD5 Optional Excise3 答案详解】 在信息技术领域,SSD5通常指的是固态硬盘(Solid State Drive)的第五代技术,它带来了更快的读写速度、更低的延迟以及更高的耐用性。Optional Exercise 3可能是一个关于SSD5...

    ssd6-excise4最终答案

    在解压后的“ssd6-excise4最终答案”文件中,可能会包含详细的步骤记录、配置截图、日志文件等,用于展示和验证优化过程及结果。对于想要学习SSD优化的人来说,这是一个宝贵的实践案例,值得深入研究和学习。

    OpelGL3.3_GetStarted_Texture_Excise3

    在这个"OpelGL3.3_GetStarted_Texture_Excise3"教程中,我们将深入探讨如何在OpenGL 3.3环境中开始使用纹理,并通过实例进行练习。 纹理映射是计算机图形学中的核心概念,它允许我们在3D模型上应用2D图像,从而增加...

    icarnegie -SSD5- Excise1

    SSD5,全称为Single Shot MultiBox Detector v5,是一种基于深度学习的目标检测算法,它在计算机视觉领域中被广泛应用。这个"icarnegie - SSD5 - Excise1"是针对SSD5的一个教程,旨在帮助学习者掌握该模型的核心概念...

    Excise11.py

    Excise11.py

    excise_1.zip

    这个场景中提到的"excise_1.zip"可能是一个包含资源或代码的压缩文件,用于实现PC端的图片查看功能,并且涉及到JavaScript(js)技术。现在我们来深入探讨相关的知识点。 首先,PC端图片查看通常是指在桌面应用程序...

    The excise

    同时,这对于那些想要为《The Excise》系统开发Java应用的人来说,是一个极好的资源库,他们可以在此基础上构建符合该操作系统需求的应用程序。 总之,《The Excise》作为一个开源的Linux派生系统,与Java的结合为...

    excise Program

    excise Programexcise Programexcise Programexcise Programexcise Programexcise Programexcise Programexcise Program

    ssd8 excise4

    全部是自己做的 绝对百分百正确率啊 而且我是网络高手啊

    SSD3-Exercise-2

    SSD3-Exercise-2 SSD3-Exercise-2 SSD3-Exercise-2 SSD3-Exercise-2 SSD3-Exercise-2 SSD3-Exercise-2 SSD3-Exercise-2 SSD3-Exercise-2

    SSD7-EXCISE5

    根据题目要求,我们将对SSD7-EXCISE5中的实体类型、属性及关系类型进行详细解析。 ### 实体类型及其属性 #### Book - **ISBN(PK)**:单值属性,作为Book实体的主键。 - **AuthorID**:多值属性,表示一本书可能有...

    卡耐基梅隆大学SSD7练习7答案——SSD7excise7答案文档+代码

    "SSD7excise7答案文档+代码"暗示了提供的内容不仅有答案,还有实现这些答案的源代码。 在描述中再次强调了这是练习7的答案,但没有提供额外的具体信息。通常,这样的解答文档会包含对问题的理解、解题步骤、关键...

    ERP系统信息化资料:SAP专业教材资料CIN Excise Invoice for SD (Return).doc

    ERP系统信息化资料:SAP专业教材资料CIN Excise Invoice for SD (Return).doc

    school_excise:作业

    【school_excise:作业】是针对Java编程语言的一个学习项目,旨在帮助学生或者初学者巩固和深化Java基础知识,提升编程技能。在这个项目中,我们可能会遇到各种与Java相关的知识点,包括但不限于基本语法、数据结构...

    卡耐基梅隆大学SSD7练习6答案——SSD7excise6

    压缩包中的"Exercise6"文件很可能包含对上述一个或多个领域的具体问题解答,可能有伪代码、流程图、源代码示例等形式。学生通过对照这些答案,可以评估自己的解题思路是否正确,理解是否有遗漏,从而加深对课程内容...

    卡耐基梅隆大学SSD7练习5答案——SSD7excise5

    3. **SSD控制器**:SSD中的控制器负责管理和优化数据传输、错误校验、磨损均衡等关键功能。分析控制器如何影响SSD的性能和寿命。 4. **I/O接口**:SSD与计算机系统间的通信通常通过SATA、PCIe或M.2接口进行。了解...

    BT种子文件分析

    BT种子文件是BitTorrent网络中用于共享文件的一种特殊文件,其内部包含了参与文件共享的用户所需要的所有信息。本文将深入探讨BT种子文件的工作原理、BT代码技术、BT下载与迅雷下载的区别,以及如何分析BT种子文件。...

    卡耐基梅隆大学SSD7练习1答案——SSD7excise1

    由于提供的信息有限,具体的练习内容和解题策略无法详细展开,但以上所述的知识点为一般软件工程练习可能涵盖的范围。在实际的学习过程中,学生可以通过分析和实现Exercise 1中的问题,深化对这些概念的理解,并提升...

    c++,IO,文件传输程序

    在C++编程中,文件传输是一项基础且重要的任务,它涉及到输入输出流(IO)以及网络通信技术。本文将深入探讨在Visual Studio 2005环境下,如何使用C++的ifstream和ofstream类进行文件读写,并结合socket编程实现文件...

    excise:Web组件的类似React的工具包

    消费税一个基于编写功能样式(类似React)的Web组件的安装npm install excise 或尝试在Chrome中使用 。用法基本的您将需要一个支持自定义元素v1和shadow dom v1的浏览器。 chrome 55可以使用。 const { define , ...

Global site tag (gtag.js) - Google Analytics