ver0.83--init.m

function cnet = init(cnet)
%init初始化cnn对象。 它应该在定义网络的所有基本参数之后调用,例如层数,卷积内核,子采样率等。唯一的事情,应该在调用init之后初始化连接矩阵!
%
%  Syntax
%  
%    cnet = init(cnet)
%    
%  Description
%   Input:
%    cnet - 卷积神经网络类对象
%   Output:
%    cnet - 初始化卷积神经网络准备训练
%
%首先是默认的虚拟层。 它的所有权重为1,所有偏差为0。
r = cnet.SLayer{1}.SRate;
    cnet.SLayer{1}.WS{1} = ones(floor(cnet.InputHeight/r),floor(cnet.InputWidth/r));
    cnet.SLayer{1}.BS{1} = zeros(floor(cnet.InputHeight/r),floor(cnet.InputWidth/r));
    cnet.SLayer{1}.FMapWidth = floor(cnet.InputWidth/r);
    cnet.SLayer{1}.FMapHeight = floor(cnet.InputHeight/r);

    %现在只有单个图像输入有效
    cnet.SLayer{1}.numFMaps = 1; 

%除输出之外的所有层
for k=2:(cnet.numLayers-cnet.numFLayers)
    if(rem(k,2)) %奇数检查
    %S-layer
        for l=1:cnet.CLayer{k-1}.numFMaps %For all feature maps
            %制作快捷方式
            r = cnet.SLayer{k}.SRate;
            fmw = cnet.CLayer{k-1}.FMapWidth;
            fmh = cnet.CLayer{k-1}.FMapHeight;
            %将所有权重初始化为1,并随机化偏置
            cnet.SLayer{k}.WS{l}= 1;
            cnet.SLayer{k}.BS{l} = rand_std(1, 1, 1);
            %存储图层属性
            cnet.SLayer{k}.FMapWidth = floor(fmw/r);
            cnet.SLayer{k}.FMapHeight = floor(fmh/r);            
        end
        %子图层不更改要素图的数量
        cnet.SLayer{k}.numFMaps = cnet.CLayer{k-1}.numFMaps;
        cnet.SLayer{k}.dEdX=cell(1,cnet.SLayer{k}.numFMaps);
    else
    %C-Layer        
            for l=1:cnet.CLayer{k}.numKernels %For all convolution kernels
             %Set random weights
              kw = cnet.CLayer{k}.KernWidth;
              kh = cnet.CLayer{k}.KernHeight;
              %下一层中的神经元具有等于权重乘以内核数目的输入数目
              cnet.CLayer{k}.WC{l} = rand_std(kh, kw, kh*kw*cnet.CLayer{k}.numKernels); 

              fmw = cnet.SLayer{k-1}.FMapWidth;
              fmh = cnet.SLayer{k-1}.FMapHeight;

              cnet.CLayer{k}.BC{l} = rand_std(1, 1, kh*kw*cnet.CLayer{k}.numKernels);
              %特征映射由“有效”卷积裁剪
              cnet.CLayer{k}.FMapWidth = fmw-kw+1;
              cnet.CLayer{k}.FMapHeight = fmh-kh+1;   
            end
     %初始化连接映射:默认情况下每个特征映射连接到每个卷积内核。
     if (~cnet.CLayer{k}.ConMap)
         cnet.CLayer{k}.ConMap = ones(cnet.CLayer{k}.numKernels, cnet.SLayer{k-1}.numFMaps);
     end
     cnet.CLayer{k}.numFMaps = cnet.CLayer{k}.numKernels;
     cnet.CLayer{k}.dEdX=cell(1,cnet.CLayer{k}.numFMaps);
    end
end

%初始化全连接层
%假设最后的C层的输出是具有单个值的单元矢量
for k=(cnet.numLayers-cnet.numFLayers+1):cnet.numLayers
    %检查该层是否是C层之后的下一层
    if (k == cnet.numCLayers+cnet.numSLayers+1)    
        cnet.FLayer{k}.W = rand_std(cnet.CLayer{k-1}.numFMaps,cnet.FLayer{k}.numNeurons,cnet.CLayer{k-1}.numFMaps+1);
        cnet.FLayer{k}.B = rand_std(1,cnet.FLayer{k}.numNeurons,cnet.CLayer{k-1}.numFMaps+1);
    else
        cnet.FLayer{k}.W = rand_std(cnet.FLayer{k-1}.numNeurons,cnet.FLayer{k}.numNeurons,cnet.FLayer{k-1}.numNeurons+1);
        cnet.FLayer{k}.B = rand_std(1,cnet.FLayer{k}.numNeurons,cnet.FLayer{k-1}.numNeurons+1);
    end
end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值