7

Estoy tratando de recrear los resultados informados en Reducing the dimensionality of data with neural networks de autocodificar el olivetti face dataset con una versión adaptada de los dígitos MNIST matlab code, pero estoy teniendo algunas dificultades. Parece que no importa cuánto ajustes haga en cuanto a la cantidad de épocas, velocidades o ímpetu, los RBM apilados están entrando en la etapa de ajuste preciso con una gran cantidad de errores y, en consecuencia, no mejoran mucho en la etapa de ajuste preciso. También estoy experimentando un problema similar en otro conjunto de datos de valores reales.Problemas con las redes de creencias profundas de entrada real (de RBM)

Por primera capa Estoy utilizando un RBM con una tasa de aprendizaje más pequeña (como se describe en el documento) y con

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

Estoy bastante seguro de que estoy siguiendo las instrucciones que se encuentran en el supporting material pero no puede lograr los errores correctos.

¿Hay algo que me falta? Vea el código que estoy usando para los RBM de unidades visibles de valores reales a continuación, y para todo el entrenamiento profundo. El resto del código se puede encontrar 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; 

Gracias por su tiempo

Respuesta

2

Tonto de mí, me había olvidado de cambiar la propagación hacia atrás el ajuste fino de la escritura (backprop.m). Uno tiene que cambiar la capa de salida (donde las caras se reconstruyen) para que sea para unidades con valores reales. Es decir.

dataout = w7probs*w8; 
+0

¿Puede explicar eso un poco? Si tiene unidades visibles de valores reales y unidades ocultas binarias, ¿no tendrá una salida binaria? ¿O cambias la última capa para que sea una capa de BG? –

Cuestiones relacionadas