代码之家  ›  专栏  ›  技术社区  ›  Junier

实值输入深度信念网络问题(RBMs)

  •  7
  • Junier  · 技术社区  · 14 年前

    我正试图重现报告中的结果 Reducing the dimensionality of data with neural networks 自动编码 olivetti face dataset 使用MNIST数字的改编版本 matlab code ,但我遇到了一些困难。似乎无论我对历元数、速率或动量做了多少调整,叠加rbm都进入了微调阶段,并且有大量的误差,因此在微调阶段没有得到很大的改善。我在另一个实值数据集上也遇到了类似的问题。

    negdata = poshidstates*vishid' + repmat(visbiases,numcases,1);
    

    supporting material

    有什么我不知道的吗?请参阅下面我用于实值可见单位rbm的代码,以及整个深度培训。剩下的代码可以找到 here .

    rbmvislinear.m公司:

    epsilonw      = 0.001; % Learning rate for weights 
    epsilonvb     = 0.001; % Learning rate for biases of visible units
    epsilonhb     = 0.001; % Learning rate for biases of hidden units 
    weightcost  = 0.0002;  
    initialmomentum  = 0.5;
    finalmomentum    = 0.9;
    
    
    [numcases numdims numbatches]=size(batchdata);
    
    if restart ==1,
      restart=0;
      epoch=1;
    
    % Initializing symmetric weights and biases.
      vishid     = 0.1*randn(numdims, numhid);
      hidbiases  = zeros(1,numhid);
      visbiases  = zeros(1,numdims);
    
    
      poshidprobs = zeros(numcases,numhid);
      neghidprobs = zeros(numcases,numhid);
      posprods    = zeros(numdims,numhid);
      negprods    = zeros(numdims,numhid);
      vishidinc  = zeros(numdims,numhid);
      hidbiasinc = zeros(1,numhid);
      visbiasinc = zeros(1,numdims);
      sigmainc = zeros(1,numhid);
      batchposhidprobs=zeros(numcases,numhid,numbatches);
    end
    
    for epoch = epoch:maxepoch,
     fprintf(1,'epoch %d\r',epoch); 
     errsum=0;
     for batch = 1:numbatches,
     if (mod(batch,100)==0)
         fprintf(1,' %d ',batch);
     end
    
    
    %%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      data = batchdata(:,:,batch);
      poshidprobs = 1./(1 + exp(-data*vishid - repmat(hidbiases,numcases,1)));  
      batchposhidprobs(:,:,batch)=poshidprobs;
      posprods    = data' * poshidprobs;
      poshidact   = sum(poshidprobs);
      posvisact = sum(data);
    
    %%%%%%%%% END OF POSITIVE PHASE  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      poshidstates = poshidprobs > rand(numcases,numhid);
    
    %%%%%%%%% START NEGATIVE PHASE  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      negdata = poshidstates*vishid' + repmat(visbiases,numcases,1);% + randn(numcases,numdims) if not using mean
      neghidprobs = 1./(1 + exp(-negdata*vishid - repmat(hidbiases,numcases,1)));  
      negprods  = negdata'*neghidprobs;
      neghidact = sum(neghidprobs);
      negvisact = sum(negdata); 
    
    %%%%%%%%% END OF NEGATIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      err= sum(sum( (data-negdata).^2 )); 
      errsum = err + errsum;
    
       if epoch>5,
         momentum=finalmomentum;
       else
         momentum=initialmomentum;
       end;
    
    %%%%%%%%% UPDATE WEIGHTS AND BIASES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        vishidinc = momentum*vishidinc + ...
                    epsilonw*( (posprods-negprods)/numcases - weightcost*vishid);
        visbiasinc = momentum*visbiasinc + (epsilonvb/numcases)*(posvisact-negvisact);
        hidbiasinc = momentum*hidbiasinc + (epsilonhb/numcases)*(poshidact-neghidact);
    
        vishid = vishid + vishidinc;
        visbiases = visbiases + visbiasinc;
        hidbiases = hidbiases + hidbiasinc;
    
    %%%%%%%%%%%%%%%% END OF UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
     end
    fprintf(1, '\nepoch %4i error %f \n', epoch, errsum);
    
    end
    

    dofacedeepauto.m:多佛斯汽车公司:

    clear all
    close all
    
    maxepoch=200; %In the Science paper we use maxepoch=50, but it works just fine. 
    numhid=2000; numpen=1000; numpen2=500; numopen=30;
    
    fprintf(1,'Pretraining a deep autoencoder. \n');
    fprintf(1,'The Science paper used 50 epochs. This uses %3i \n', maxepoch);
    
    load fdata
    %makeFaceData;
    
    [numcases numdims numbatches]=size(batchdata);
    
    fprintf(1,'Pretraining Layer 1 with RBM: %d-%d \n',numdims,numhid);
    restart=1;
    rbmvislinear;
    hidrecbiases=hidbiases; 
    save mnistvh vishid hidrecbiases visbiases;
    
    maxepoch=50;
    fprintf(1,'\nPretraining Layer 2 with RBM: %d-%d \n',numhid,numpen);
    batchdata=batchposhidprobs;
    numhid=numpen;
    restart=1;
    rbm;
    hidpen=vishid; penrecbiases=hidbiases; hidgenbiases=visbiases;
    save mnisthp hidpen penrecbiases hidgenbiases;
    
    fprintf(1,'\nPretraining Layer 3 with RBM: %d-%d \n',numpen,numpen2);
    batchdata=batchposhidprobs;
    numhid=numpen2;
    restart=1;
    rbm;
    hidpen2=vishid; penrecbiases2=hidbiases; hidgenbiases2=visbiases;
    save mnisthp2 hidpen2 penrecbiases2 hidgenbiases2;
    
    fprintf(1,'\nPretraining Layer 4 with RBM: %d-%d \n',numpen2,numopen);
    batchdata=batchposhidprobs;
    numhid=numopen; 
    restart=1;
    rbmhidlinear;
    hidtop=vishid; toprecbiases=hidbiases; topgenbiases=visbiases;
    save mnistpo hidtop toprecbiases topgenbiases;
    
    backpropface; 
    

    谢谢你的时间

    1 回复  |  直到 12 年前
        1
  •  2
  •   Junier    14 年前

    我真傻,我忘了更改反向传播微调脚本(backprop.m)。一个必须改变输出层(在那里面得到重建)是实值单位。即。

    dataout = w7probs*w8;