私は単一出力の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}]でエラーが発生しました= ...
私はこの問題を解決するために何をすべきか?ありがとうございます
>私は単一出力のMNISTデータセットをトレーニングしようとしています しないでください。分類タスクに回帰を使用することは悪い考えです。 –
これは悪い考えですが、私はこれをしなければなりません。 –
私はvl_simplennを変更し、ノーマルロスを最後のレイヤーとして使用したと言っていましたが、出力をネットで鍛えるとsoftmaxlossそれはノルムロスを使用していません。なぜこのようなことが起こったのか考えていますか? –