2016-03-23 1 views
2

CNNを使って回帰を実装しようとしています。画像を入力すると(RGB、32x32x3)、モデルは画像内のオブジェクトの面積の割合を表す正規化された値、たとえば0.711を教えてくれます画像サイズ次のようにMatConvNetにおいて、Iは、回帰損失関数を実装:MatConvNetを使って出力回帰値を[0,1]の範囲で作る方法は?

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 

およびIは、以下のようにCifar-10ネットワーク構造の第2の最後の層を改変:

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') ; 

が、出力回帰値(テスト)は[0,1]の範囲にはありません。なぜこのことが起こったのか分かりません。私の設定に何か間違っていますか?ありがとう!

答えて

1

トレーニング後にシグモイド関数を最後のレイヤーに配置したり、シグモイド関数を配置したりすることができます。手動で定義することができるnet.layers{end}.type='sigmoid';(私はこれが正しく書かれているかわからない)

など

。 0から1の間の数値を返します。

関連する問題