2016-12-23 12 views
1

私は単一出力のMNISTデータセットを訓練しようとしています。それは、私が28 * 28の入力(画像)を与えたときにモデルがちょうど私たちに与えることを意味します。たとえば、私は '5'を与え、モデルは結果として4.9,5、5.002または5に近い値を与えます。だから私はいくつかの文書を赤色にします。人々はsoftmaxlayerを回帰層で変更する必要があると伝えます。これを行うために。私はmatconvnetライブラリとそのmnistの例を使用しています。ネットワークを変更し、回帰層損失関数を書きました。これらは私のコードです:matconvnetで回帰してsoftmaxlayerを変更する方法

net.layers = {} ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(5,5,1,20, 'single'), zeros(1, 20, 'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'max', ... 
          'pool', [2 2], ... 
          'stride', 2, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(5,5,20,50, 'single'),zeros(1,50,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'max', ... 
          'pool', [2 2], ... 
          'stride', 2, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(4,4,50,500, 'single'), zeros(1,500,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'relu') ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(1,1,500,1, 'single'), zeros(1,1,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ;       
net.layers{end+1} = struct('type', 'normloss'); 

これは、回帰損失関数である:

function Y = vl_normloss(X,c,dzdy) 
size(X)%1 1 1 100 
size(c)%1 100 

if nargin <= 2 

Y = 0.5*sum((squeeze(X)'-c).^2); 
size(Y)%1 1 
Y  % 1.7361e+03 
else 
size(Y) 
Y = +((squeeze(X)'-c))*dzdy; 
Y = reshape(Y,size(X)); 
end 

私はまた私がスクリプト

をvl_simplennする

case 'normloss' 
     res(i+1).x = vl_normloss(res(i).x,l.class) ; 

を追加しかし、ときopts.errorFunction = 'multiclass' ; 'none'にを変更しました私はこのエラーが発生する列車を実行する

vl_nnconvを使用しているエラーDEROUTPUTディメンションは、Xおよび FILTERSと互換性がありません。

vl_simplenn(ライン415) [RES(I).dzdx、dzdw {1}、dzdw {2}]でエラーが発生しました= ...

私はこの問題を解決するために何をすべきか?ありがとうございます

+0

>私は単一出力のMNISTデータセットをトレーニングしようとしています しないでください。分類タスクに回帰を使用することは悪い考えです。 –

+0

これは悪い考えですが、私はこれをしなければなりません。 –

+0

私はvl_simplennを変更し、ノーマルロスを最後のレイヤーとして使用したと言っていましたが、出力をネットで鍛えるとsoftmaxlossそれはノルムロスを使用していません。なぜこのようなことが起こったのか考えていますか? –

答えて

0

解決策が見つかりました。私は間違いを犯した。 vl_simplennスクリプトでは2つの異なる行を変更する必要がありますが、1行しか変更しませんでした。このコードは機能します。

0

私は質問があります。

net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(1,1,500,1, 'single'), zeros(1,1,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ;       
net.layers{end+1} = struct('type', 'normloss'); 

convレイヤーでは、出力[1 1 500 1]は1x500の記述子を示しますか?損失層ではどのようにその値を使用していますか?損失層softmaxがクラスprobを予測するべきではないか、それからあなたは最も高いprobの対応するクラスを見つけるでしょうか?あるいは、この場合、[1 1 500 1]の出力は確率?

+0

これは答えの代わりに質問へのコメントのようです。あなたがコメントするつもりなら、あなたは[コメント](http://stackoverflow.com/help/privileges/comment)への十分な[評判](http://stackoverflow.com/help/whats-reputation)を持っている必要があります。役職。また、これを確認してください(代わりに何ができますか?)(https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reationation-to-comment-what-c​​an-i-do-instead )。 – thewaywewere

+0

ノルムロス層はソフトマックスと似ていません。つまり、ノルムロスは最も高い確率でどのクラスも予測しないということです。ただ価値を見つけるだけです。この値はクラスprobではありません。最後のレイヤーでも、500の入力は1つの出力にしかなりません。したがって、出力は1つだけです。 –

+0

したがって、fc [1 1 500 1]の値はノルムロスに使用されていますか?私はその特徴ベクトル1x500を意味する。ノルムロスには計算があります(input-GroundTruth)。しかし、グランドトゥルース、例えば。 5、何が減算されますか?これは回帰を正しくしていますか? – h612

関連する問題