matconvnet學習三:matlab中的類定義(待繼續學習)

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 = [email protected](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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章