2016-03-23 14 views
2

Resim girdiğim (RGB, 32x32x3) CNN kullanarak bir regresyon gerçekleştirmeye çalışıyorum ve model görüntüdeki nesnenin alan oranını temsil eden normalleştirilmiş bir değer, ör. görüntü boyutu. (ZamanMatConvNet'i kullanarak çıkış gerileme değerini [0,1] aralığında nasıl yapılır?

lr = [.1 2] ; 

% Define network CIFAR10-quick 
net.layers = {} ; 

% Block 1 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{0.01*randn(5,5,3,32, 'single'), zeros(1, 32, 'single')}}, ... 
          'learningRate', lr, ... 
          'stride', 1, ... 
          'pad', 2) ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'max', ... 
          'pool', [3 3], ... 
          'stride', 2, ... 
          'pad', [0 1 0 1]) ; 
net.layers{end+1} = struct('type', 'relu') ; 

% Block 2 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{0.05*randn(5,5,32,32, 'single'), zeros(1,32,'single')}}, ... 
          'learningRate', lr, ... 
          'stride', 1, ... 
          'pad', 2) ; 
net.layers{end+1} = struct('type', 'relu') ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'avg', ... 
          'pool', [3 3], ... 
          'stride', 2, ... 
          'pad', [0 1 0 1]) ; % Emulate caffe 

% Block 3 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{0.05*randn(5,5,32,64, 'single'), zeros(1,64,'single')}}, ... 
          'learningRate', lr, ... 
          'stride', 1, ... 
          'pad', 2) ; 
net.layers{end+1} = struct('type', 'relu') ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'avg', ... 
          'pool', [3 3], ... 
          'stride', 2, ... 
          'pad', [0 1 0 1]) ; % Emulate caffe 

% Block 4 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{0.05*randn(4,4,64,64, 'single'), zeros(1,64,'single')}}, ... 
          'learningRate', lr, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'relu') ; 

% Block 5 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{0.05*randn(1,1,64,1, 'single'), zeros(1,1,'single')}}, ... 
          'learningRate', .1*lr, ... 
          'stride', 1, ... 
          'pad', 0) ; 
% Loss layer 
net.layers{end+1} = struct('type', 'l2normloss') ; 

Ancak çıkış regresyon değeri:

function Y = vl_l2normloss(X,c,dzdy) 
assert(numel(X) == numel(c)); 
% n = sizer(X,1) * size(X,2); 
n = size(X,4); 
if nargin <= 2 
    Y = sum((X(:) - c(:)).^2) ./ (2*n); 
else 
    assert(numel(dzdy) == 1); 
    Y = reshape((dzdy/n) * (X(:) - c(:)), size(X)); 
end 

Ve ayrıca aşağıdaki gibi cifar-10 ağ yapısının ikinci son kat modifiye aşağıdaki gibidir: MatConvNet, ben regresyon kaybı fonksiyonu hayata test) [0,1] aralığında DEĞİLDİR. Bunun neden olduğu hakkında hiçbir fikrim yok. Ayarımda yanlış bir şey var mı? Teşekkürler!

cevap

1

Son katınıza bir sigmoid işlevi koyabilir veya antrenmandan sonra sigmoid işlevini ayarlayabilirsiniz.

o net.layers{end}.type='sigmoid'; gibi

(Bu doğru yazılır emin değilim)

veya elle tanımlayabilirsiniz. 0 ile 1 arasında bir sayı verir.

İlgili konular