ロス関数としてのDICE係数について

919 views
Skip to first unread message

tatuya

unread,
Apr 13, 2018, 6:36:32 AM4/13/18
to Neural Network Console Users (JP)
現在、neural network consoleを用いてU-netの実装を試みているのですが、
editタブ内でのDICE係数の計算に苦戦しています。

どのレイヤーをどの順序で組み合わせれば算出できるかアドバイスいただけないでしょうか。
また、算出したDICE係数をどのように設定すればロス関数として扱えるのでしょうか。
データセットはx:元画像、y:物体のマスク画像としています。

よろしくお願いします。

小林由幸

unread,
Apr 19, 2018, 7:52:46 AM4/19/18
to Neural Network Console Users (JP)

こちらのネットワークで算出できるかと思います。
基本的にはMath、Arithmeticレイヤーを数式の通り組み合わせることで実現します。




また、Neural Network Consoleでは学習に用いるネットワークの、末端のレイヤーの
出力値の合計がロスとして扱われます。

tatuya

unread,
Apr 22, 2018, 10:18:16 PM4/22/18
to Neural Network Console Users (JP)
ご返答ありがとうございます。

「Prediction」をU-netの最後の出力、「True」をyとして、教えていただいたネットワークを実行するとtrainingは実行することができました。
しかしEvaluationは「[nnabla]: data 0 / 30」という表示が連続してあらわれてデータを読みこんでいる気配がありません。

データセットの選択に問題があるのでしょうか。
validationデータセットもx:元画像、y:物体のマスク画像としています。

ご意見をよろしくお願いします。

小林由幸

unread,
Apr 27, 2018, 3:39:48 AM4/27/18
to Neural Network Console Users (JP)

> しかしEvaluationは「[nnabla]: data 0 / 30」という表示が連続してあらわれてデータを読みこんでいる気配がありません。


こちらの挙動はバグの可能性があります。

Batch sizeはいくつに設定されていますでしょうか。
また、学習時には正しく評価表示されていますでしょうか。
もし他にも同様の現象に遭遇したという方がいらっしゃいましたらお知らせください。

tatuya

unread,
Apr 29, 2018, 1:41:30 AM4/29/18
to Neural Network Console Users (JP)
ご回答いただきありがとうございます。

batch sizeは20、Epochは20で実行しました。
ちなみにtraining データセットは1200ペア、validationデータセットは30ペアの560×360の元画像と物体のマスク画像を使用しました。

学習中には正しく評価できていると思われますが、念のためedit画面と結果のキャプチャを添付します。
ご意見よろしくお願いします。
DICE.png
evaluation.png
training.png

小林由幸

unread,
May 6, 2018, 11:36:31 PM5/6/18
to Neural Network Console Users (JP)
情報ありがとうございます。

恐らくロス関数が存在しないMainネットワークを用いている結果、
自動生成される推論用ネットワークが空になっているのではないかと推測されます。
この現象を回避するには

1. EDITタブ、Mainネットワークタブ右の+ボタンをクリックして新しいネットワークを追加
2. ネットワーク名(Network_2)をクリックしてRuntimeなどにリネーム
3. Mainネットワークの内容を全選択(Ctrl+A)してコピー(Ctrl+C)
4. RuntimeネットワークにコピーしたMainネットワークを貼り付け(Ctrl+V)
5. Runtimeネットワークで、Convolution_5以下のレイヤー(DICEロス)を削除
6. もしBatchNormalizationを利用している場合、Runtimeネットワークの
 全てのBatchNormalizationのBatchStatプロパティをFalseに設定
7. Runtimeネットワークの最後(Convolution_15)にIdentityレイヤーを接続し、Nameプロパティを「y'」にリネーム
8. CONFIGタブ、ExecutorのNetworkを「MainRuntime」から「Runtime」に変更


以上の設定を行ったうえで学習を実行します。
明示的に推論時(Executorで設定)に用いるネットワークを指定することができます。

tatuya

unread,
May 14, 2018, 6:01:46 AM5/14/18
to Neural Network Console Users (JP)
ありがとうございます。
教えていただいた手法を実行すると、Evaluationは正常に動作し、何かしらの画像も出力されました。

いくつか疑問に思ったのですが、
DICE係数は0から1.0の数値をとり、画像が類似しているほど1.0に近づきますが、
これをロス関数に用いる場合は「1.0-DICE係数」としたほうが良いのでしょうか。

また、出力される画像(ここではy')をbinary画像としたい場合は何か良い方法はありますでしょうか。

ご回答をよろしくお願いします。

小林由幸

unread,
May 16, 2018, 9:40:30 PM5/16/18
to Neural Network Console Users (JP)
はい、Neural Network ConsoleではBatch Gradient Descent(バッチ勾配降下法)を用いた
最適化を行いますので、学習用ネットワークの出力は小さいほどbetterである値、ロスである必要があります。
今回のケースでは1-Dice係数を用いられるのが良いかと思います。

出力画像を0.5を境に0、1の2値化して出力したい場合は、
推論用ネットワークの最後にGreaterScalar(Value=0.5)、BinarySigmoidのいずれかを
用いられるとよいかと思います。

tatuya

unread,
May 25, 2018, 5:35:48 AM5/25/18
to Neural Network Console Users (JP)
ご回答いただきありがとうございます。

とても参考になりました。しばらく試行錯誤してみようと思います。
Reply all
Reply to author
Forward
Message has been deleted
0 new messages