matconvnet的Dagnn文件夹中定义了一系列的类如Layers,conv等等,类的构成一般为:
classdef classname
properties
end
methods
end
end
详细了解的话,可以使用doc classdef命令,去读一下matlab的帮助文档
code1:这个就是matconvnet下卷积层类的定义方法
classdef Conv < dagnn.Filter %(<代表继承)
properties
size = [0 0 0 0]
hasBias = true
opts = {'cuDNN'}
end
methods
function outputs = forward(obj, inputs, params)
if ~obj.hasBias, params{2} = [] ; end
outputs{1} = vl_nnconv(...
inputs{1}, params{1}, params{2}, ...
'pad', obj.pad, ...
'stride', obj.stride, ...
'dilate', obj.dilate, ...
obj.opts{:}) ;
end
function [derInputs, derParams] = backward(obj, inputs, params, derOutputs)
if ~obj.hasBias, params{2} = [] ; end
[derInputs{1}, derParams{1}, derParams{2}] = vl_nnconv(...
inputs{1}, params{1}, params{2}, derOutputs{1}, ...
'pad', obj.pad, ...
'stride', obj.stride, ...
'dilate', obj.dilate, ...
obj.opts{:}) ;
end
function kernelSize = getKernelSize(obj)
kernelSize = obj.size(1:2) ;
end
function outputSizes = getOutputSizes(obj, inputSizes)
outputSizes = getOutputSizes@dagnn.Filter(obj, inputSizes) ;
outputSizes{1}(3) = obj.size(4) ;
end
function params = initParams(obj)
% Xavier improved
sc = sqrt(2 / prod(obj.size(1:3))) ;
%sc = sqrt(2 / prod(obj.size([1 2 4]))) ;
params{1} = randn(obj.size,'single') * sc ;
if obj.hasBias
params{2} = zeros(obj.size(4),1,'single') ;
end
end
function set.size(obj, ksize)
% make sure that ksize has 4 dimensions
ksize = [ksize(:)' 1 1 1 1] ;
obj.size = ksize(1:4) ;
end
function obj = Conv(varargin)
obj.load(varargin) ;
% normalize field by implicitly calling setters defined in
% dagnn.Filter and here
obj.size = obj.size ;
obj.stride = obj.stride ;
obj.pad = obj.pad ;
end
end
end
code:2我自己的一个小demo
classdef classdemo<handle
%2018.12.12
%实例化: l=classdemo
%存放类的文件夹一般以@开头+类的名字
properties (Access=public)
%properties的有一个属性Access
%Access=public是公有
%protected保护成员,只有类或者子类能调用
%private只能通过本类对象访问
name='sunyi';
sex='man';
end
methods (Static)%如果使用Static属性可以直接调用,不需要实例化
function print(obj,choice)
if(strcmp(choice,'name'))
fprintf('name:%s\n',obj.name);
elseif(strcmp(choice,'sex'))
fprintf('name:%s\n',obj.sex);
end
end
end
events
end
enumeration
end
end
@命令
@命令用于获取函数句柄的操作符,可以部分改变函数的入口参数数目:
F=@sin
则F(90)=0
函数名=@(参数列表) 运算表达式(或者函数),由此可以定义一个新的 函数
Y=@(x) x^2
Y(4)=16
Y=@(x) Calculating(x,y) %Calculating(x,y)为一个函数,Y则是基于Calculating只需要一个入口参数的新的函数
------------------------------------------------------------------2020.06.22----------------------------------------------------------------------
@文件夹里面存储的是类的.m文件,也可以将类的methods函数放进去(比如methods太大,需要单独放在一个.m文件里面)
+开头的文件夹存储的则是代表的是一个package,里面可以包含@文件夹和功能函数,也可以包含类文件