正解ラベルが複数ある場合にはどのような設計になりますか?

9,769 views
Skip to first unread message

invertedt...@gmail.com

unread,
Nov 20, 2015, 12:19:32 AM11/20/15
to Chainer User Group
はじめまして。最近Chainerを使い始めました。

MNISTなどよくある多ラベル分類のサンプルは「複数の選択肢のうち正解が1つ」なのでsoftmax_cross_entropyが使われると思います。一方、「複数の選択肢のうち正解が複数ある」場合はどのようにforward関数もしくはネットワークを設計したらよいのでしょうか?

たとえば以下のような用途を想定しています。

- 写真を分類したいが、複数のラベルがつけられる可能性がある(ラベルとしては海でもあるし船でもある、など)
- 環境センサーの入力からロボットの関節を動かす(出力ノードが1つの関節の制御とひもづいている)

Kenta Oono

unread,
Dec 2, 2015, 5:07:27 AM12/2/15
to Chainer User Group, invertedt...@gmail.com
こんにちは

単純な方法としては、ラベルの数だけの2値分類器を用意して、
各ラベルが付くか付かないかを対応する分類器に予測させる方法が考えられます

その他の方法に関しては、例えばこちらのサイトなどが詳しいです。


2015年11月20日金曜日 14時19分32秒 UTC+9 invertedt...@gmail.com:

invertedt...@gmail.com

unread,
Dec 3, 2015, 9:18:21 PM12/3/15
to Chainer User Group
ご回答ありがとうございます!
紹介いただいたサイトも参考になりました。

ニューラルネットワークの仕組みを考えたときに、例えば以下のケースで考えると

> - 写真を分類したいが、複数のラベルがつけられる可能性がある(ラベルとしては海でもあるし船でもある、など)

出力層のそれぞれのノードに各ラベル(海、船、etc.)を割り当てることで、「海ノードが発火したら海、船ノードが発火したら船」のような構造にすることでマルチラベルに対応する方法も考えられるのかな、と思っていました。

そのような構造は一般的ではないのでしょうか?また、Chainerで構築することは難しいでしょうか?


2015年12月2日水曜日 19時07分27秒 UTC+9 Kenta Oono:

Kenta Oono

unread,
Dec 4, 2015, 2:42:01 AM12/4/15
to Chainer User Group, invertedt...@gmail.com

> 出力層のそれぞれのノードに各ラベル(海、船、etc.)を割り当てることで、「海ノードが発火したら海、船ノードが発火したら船」
> のような構造にすることでマルチラベルに対応する方法も考えられるのかな、と思っていました。
はい、そのような方法もあると思います。つまり、最終層はラベルの数と同数のユニットを持ち、
各ユニットは対応するラベルが割り当てられる確率を表します。
出力を確率として解釈するには出力の値域が[0, 1]に入っている必要がありますが、それは最終層をsigmoid関数にすることで実現できます。

Chainerの場合、sigmoid_cross_entropyという、sigmoid関数を適用した後に正解ラベルと交差エントロピーを計算するfunctionが実装されています。

バッチサイズをB、ラベル数をNとした時に、
xをNNの出力、tを正解として(どちらもshapeが(B, N)で、x[i, j], t[i, j]でi番目の訓練データのj番目のラベルの予測確率と正解ラベルを表します)
loss = F.sigmoid_cross_entropy(x, y)
とすれば、損失関数を計算できます

2015年12月4日金曜日 11時18分21秒 UTC+9 invertedt...@gmail.com:

invertedt...@gmail.com

unread,
Dec 6, 2015, 8:56:06 PM12/6/15
to Chainer User Group
コメントいただいた通り、sigmoid_cross_entropyを使ってtrainingできました!ありがとうございます。

関連して追加質問なのですが、このままaccuracyを求めようとすると以下のようなaccuracy関数はshapeが異なるとエラーが出てしまいます。

acc = F.accuracy(x, t)

これはaccuracy関数のtが一次元のベクトルを要求しているからだと認識していますが、このような出力ノードがラベル数あるようなネットワークについてaccuracyを求めるうまい方法はありますでしょうか?


2015年12月4日金曜日 16時42分01秒 UTC+9 Kenta Oono:

Kenta Oono

unread,
Dec 6, 2015, 10:07:03 PM12/6/15
to Chainer User Group, invertedt...@gmail.com
大野です。

> これはaccuracy関数のtが一次元のベクトルを要求しているからだと認識していますが、このような出力ノードがラベル数あるようなネットワークについてaccuracyを求めるうまい方法はありますでしょうか?
ラベルごとにaccuracyを計算するか、全てのラベルを考慮して1つのaccuracyを計算するかが考えられますが、両方とも可能です。

前者の場合
split_axis Functionを用いて、shapeが共に(B, N)である予測結果xを、shapeが(B, )の配列がN個入ったtupleに変換します
(Bはバッチサイズ、Nはラベル数です)。同様の操作を正解ラベルtに対しても行います。
そして、対応するxとtの要素のN組のペアに対してそれぞれaccuracyを計算します。

後者の場合
2通りの方法が考えられます。1つ目は前者の方法で計算したそれぞれのaccuracyの平均をとる方法です。
もう1つの方法は、reshape Functionを用いて、shapeが(B, N)の予測結果xと正解ラベルを(B*N, )のshapeに変形して、
(1つの)accuracy Functionに与える方法です。

2015年12月6日日曜日 20時56分06秒 UTC-5 invertedt...@gmail.com:

invertedt...@gmail.com

unread,
Dec 9, 2015, 1:06:41 AM12/9/15
to Chainer User Group
いずれの方法も、N個の2値問題としてF.accuracyにかけるということですね。
コメントいただいた方法(前者、後者とも)でうまくいきました!

chainerに対する理解も深まり、大変参考になりました。
初歩的な質問にも関わらず、長々お付き合いいただきどうもありがとうございました。


2015年12月7日月曜日 12時07分03秒 UTC+9 Kenta Oono:

Kenta Oono

unread,
Dec 10, 2015, 7:24:07 AM12/10/15
to Chainer User Group, invertedt...@gmail.com
大野です

> コメントいただいた方法(前者、後者とも)でうまくいきました!
おお、良かったです。質問を共有していただきありがとうございました。

2015年12月9日水曜日 1時06分41秒 UTC-5 invertedt...@gmail.com:
Reply all
Reply to author
Forward
0 new messages