123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- % function [R,neg] = whitenWithDropout(bg,lda,nx,ny)
- % Obtain whitenixng matrix and mean from a general HOG model
- % by a cholesky decompoition on a stationairy covariance matrix
- % feat' = R\(feat - neg) has zero mean and unit covariance
- %
- % bg.neg: negative mean (nf by 1)
- % bg.cov: covariance for k spatial offsets (nf by nf by k)
- % bg.dxy: k spatial offsets (k by 2)
- % lda.lambda: regularizer
- function [R,neg,b_success] = whitenWithDropout(bg,lda,nx,ny)
- if ( nargout > 2 )
- b_success = true;
- end
-
- % % the following line is intended to prevent memory overwhelming due to
- % % impossibly large covariance matrices which could be desired for large
- % % selected regions...
- % %
- % % size(bg.cov,1) -> number of feature dimensions
- % % nx -> size of desired filter x dimension
- % % ny -> size of desired filter y dimension
- % %
- % if ( ((nx*ny)^2 * size(bg.cov,1)^2 )> 5*10e8 )
- % if ( nargout > 2 )
- % R = [];
- % neg = [];
- % b_success = false;
- % return;
- % end
- % end
- % now start the actual whitening
- neg = repmat(bg.neg',ny*nx,1);
- neg = neg(:);
- p = 1;
-
-
-
- % if ( ~isfield(lda,'b_noiseDropOut') || isempty(lda.b_noiseDropOut) )
- % b_noiseDropOut = true;
- % else
- % b_noiseDropOut = lda.b_noiseDropOut;
- % end
- %
- % if ( ~isfield(lda,'d_dropOutProb') || isempty(lda.d_dropOutProb) )
- % d_dropOutProb = 0.1;
- % else
- % d_dropOutProb = lda.d_dropOutProb;
- % end
-
-
- while(p~=0)
- [sig, b_success] = reconstructSig(nx,ny,bg.cov,bg.dxy);
- if ( ~b_success)
- R = [];
- neg = [];
- if ( nargout > 2 )
- b_success = false;
- end
- return;
- end
- % drop-out like noise model, as described by Chen et al. (Marginalized Denoising Autoencoders for Domain Adaptation)
- if ( lda.b_noiseDropOut )
- d=size(sig,1);
- q=ones(d,1) .* (1-lda.d_dropOutProb);
- sig=sig.*(q*q');
- end
- % Gaussian noise model for every dimension
- sig = sig + lda.lambda*eye(size(sig));
- [R,p] = chol(sig);
- if p ~= 0,
- %disp('Increasing lambda');
- lda.lambda = lda.lambda*5;
- %display('Sig is not positive definite, add a larger regularizer');
- %keyboard;
- end
- end
- end
-
- function [w, b_success] = reconstructSig(nx,ny,ww,dxy)
- % W = reconstructSig(nx,ny,ww,dxy)
- % W = n x n
- % n = ny * nx * nf
- if ( nargout > 1 )
- b_success = true;
- end
- k = size(dxy,1);
- nf = size(ww,1);
- n = ny*nx;
- try
-
- w = zeros(nf,nf,n,n);
- for x1 = 1:nx,
- for y1 = 1:ny,
- i1 = (x1-1)*ny + y1;
- for i = 1:k,
- x = dxy(i,1);
- y = dxy(i,2);
- x2 = x1 + x;
- y2 = y1 + y;
- if x2 >= 1 && x2 <= nx && y2 >= 1 && y2 <= ny,
- i2 = (x2-1)*ny + y2;
- w(:,:,i1,i2) = ww(:,:,i);
- end
- x2 = x1 - x;
- y2 = y1 - y;
- if x2 >= 1 && x2 <= nx && y2 >= 1 && y2 <= ny,
- i2 = (x2-1)*ny + y2;
- w(:,:,i1,i2) = ww(:,:,i)';
- end
- end
- end
- end
- % Permute [nf nf n n] to [n nf n nf]
- w = permute(w,[3 1 4 2]);
- w = reshape(w,n*nf,n*nf);
- % Make sure returned matrix is close to symmetric
- assert(sum(sum(abs(w - w'))) < 1e-5);
- w = (w+w')/2;
- catch err
- w = [];
- if ( nargout > 1 )
- b_success = false;
- end
- return;
- end
- end
|