ClassWeightsの設定方法

深層学習を使用したセマンティック セグメンテーションhttps://jp.mathworks.com/help/releases/R2018a/vision/examples/semantic-segmentation-using-deep-learning.html
をもとに自分で用意したデータセットで解析を行ったところ以下のようなエラーが出ました.
無題.png
以下にi_learningのコードを示します.
%ネットワークの作成
imageSize = [360 480 3];
numClasses = numel(classes);
lgraph = segnetLayers(imageSize,numClasses,'vgg16');
%クラスの重み付けを使用したクラスのバランス調整
imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount;
classWeights = median(imageFreq) ./ imageFreq;
pxLayer = pixelClassificationLayer('Name','labels','ClassNames',tbl.Name,'ClassWeights',classWeights);
lgraph = removeLayers(lgraph,'pixelLabels');
lgraph = addLayers(lgraph, pxLayer);
lgraph = connectLayers(lgraph,'softmax','labels');
%学習オプションの選択
options = trainingOptions('sgdm', ...
'Momentum',0.9, ...
'InitialLearnRate',1e-3, ...
'L2Regularization',0.0005, ...
'MaxEpochs',100, ...
'MiniBatchSize',2, ...
'Shuffle','every-epoch', ...
'VerboseFrequency',2);
%データ拡張
augmenter = imageDataAugmenter('RandXReflection',true,...
'RandXTranslation',[-10 10],'RandYTranslation',[-10 10]);
%学習の開始
pximds = pixelLabelImageDatastore(imdsTrain,pxdsTrain,'DataAugmentation',augmenter);
net= trainNetwork(pximds,lgraph,options);

 Accepted Answer

Kenta
Kenta on 18 Dec 2019
classWeights
と入力して、それぞれの値を教えてもらえますか?訓練データに、ある稀なラベルが含まれていなくて0で割っている状態なのではないかと思いました。
classWeights = median(imageFreq) ./ (imageFreq+0.0001);
などとすれば回避できると思いました。

10 Comments

Kodai Sato
Kodai Sato on 18 Dec 2019
classWeightsはどこに入力すればよいのでしょうか?
コマンドウィンドウに入力すると関数または変数 'classWeights' が認識されません。と返ってきます.
imageFreq
そうですね、失礼いたしました。うえのように打って下さい。
Kodai Sato
Kodai Sato on 18 Dec 2019
申し訳ありません
そちらの関数でも認識されませんでした
クラス別のピクセル数はグラフがあるので一応添付します
untitled.png
tbl.ImagePixelCount
何度もすいません、こちらを打ってみてください。
以下のようになりました
>> tbl.ImagePixelCount
ans =
20719666
4297113
0
0
3,4番目の出現数が0なので、0で割ると、無限大になってしまいますね。
そのため、クラスの重みも無限になってしまい。エラーを返したということですね。
そのため、
imageFreq = tbl.PixelCount ./ (tbl.ImagePixelCount+1);
などとして、分母が0になるのを防ぐと、うまく実行できると思います。
その後のコードで変更があれば、適宜変更していただけると幸いです。
ただ、ここまで大きくクラスに偏りがあると、課題設計を少し変更した方がいいかもしれません。
何度も申し訳ありません
上のコードのように変更しましたが同様なエラーが発生します
imageFreq =
0.1032
0.0000
0
0
imageFreq = tbl.PixelCount ./ (tbl.ImagePixelCount+1);
classWeights = median(imageFreq) ./ (imageFreq+0.001)+0.0001;
などとすれば、ひとまず動きますでしょうか?
tbl.PixelCount
を実行したところこちらも0であったため
imageFreq = (tbl.PixelCount+1) ./ (tbl.ImagePixelCount+1);
としたところ実行できました
何度も申し訳ありませんでした
Kenta
Kenta on 19 Dec 2019
はい、無事実行できてよかったです。

Sign in to comment.

More Answers (0)

Categories

Find more on Deep Learning Toolbox in Help Center and File Exchange

Products

Release

R2019b

Asked:

on 18 Dec 2019

Commented:

on 19 Dec 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!