7

Я пытаюсь воссоздать результаты, полученные в Reducing the dimensionality of data with neural networks, с автокодированием olivetti face dataset с адаптированной версией цифр MNIST matlab code, но с некоторыми трудностями. Кажется, что независимо от того, сколько настроек я делаю в отношении количества эпох, ставок или импульса, уложенные RBM наступают на стадию точной настройки с большой ошибкой и, следовательно, не могут значительно улучшиться на этапе точной настройки. Я также сталкиваюсь с аналогичной проблемой в другом реальном наборе данных.Проблемы с реальными сетями с глубокими убеждениями ввода данных (из 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; 

Спасибо за ваше время

ответ

2

Глупый меня, я забыл изменить обратного распространения тонкой настройки сценария (backprop.m). Нужно изменить выходной уровень (где лица будут восстановлены) для вещественных единиц. То есть

dataout = w7probs*w8; 
+0

Можете ли вы объяснить это немного? Если у вас есть видимые видимые единицы и бинарные скрытые единицы, у вас нет бинарного выхода? Или вы меняете последний слой на уровень BG? –