追記:重大ミス
binary_crossentropyに変えたら精度が良くなったというのは勘違いでした。model.evaluate()で出てくる数字や学習中に出てくるaccuracyというのが caetgorical_accuracyではなく binary_accuracyとして表示されてしまっていたのが原因でした。
また、ここで手計算している binary_crossentropyというのもよくわからない計算をしたものになっています。混乱していた中で書いてしまった恥ずかしいミスです。こんなミスがあったということを覚えておくために残しておきますが、以下の情報は役には立ちません。
kerasでcifar10の画像分類を試していたところ、最後の損失関数をcategorical_crossentropyから binary_crossentropyに変えたら急に精度が良くなりました。
70% -> 95%
categorical_crossentropyとbinary_crossentropyのイメージがつかなかったので手計算してみました。
これで合ってるかな・・・?
binary cross entropyの方が出力がなだらかになる感じですね。
2クラス分類(categoricalもbinaryも同じ)
| y | p |
|---|---|
| 0 | 0.9 |
| 1 | 0.1 |
if t = 0
-(0log(0.1) + 1log(0.9))
= 0.105
if t = 1
-(1log(0.1) + 0log(0.9))
= 2.303
3クラス分類① categorical
| y | p |
|---|---|
| 0 | 0.9 |
| 1 | 0.05 |
| 2 | 0.05 |
if t = 0
-(1log(0.9) + 0log(0.05) + 0*log(0.05))
= 0.105
if t = 1
-(0log(0.9) + 1log(0.05) + 0*log(0.05))
= 2.996
if t = 2
-(0log(0.9) + 0log(0.05) + 1*log(0.05))
= 2.996
3クラス分類① binary
| y | p |
|---|---|
| 0 | 0.9 |
| 1 | 0.05 |
| 2 | 0.05 |
if t = 0
-(1log(0.9) + 0log(0.05) + 0*log(0.05))
= 0.105
if t != 1
-(0log(0.9) + 1log(1 - 0.9))
= 2.303
3クラス分類② categorical
| y | p |
|---|---|
| 0 | 0.6 |
| 1 | 0.3 |
| 2 | 0.1 |
if t = 0
-(1log(0.6) + 0log(0.3) + 0*log(0.1))
= 0.511
if t = 1
-(0log(0.6) + 1log(0.3) + 0*log(0.1))
= 1.204
if t = 2
-(0log(0.6) + 0log(0.3) + 1*log(0.1))
= 2.303
3クラス分類② binary
| y | p |
|---|---|
| 0 | 0.6 |
| 1 | 0.3 |
| 2 | 0.1 |
if t = 0
-(1log(0.6) + 0log(0.3) + 0*log(0.1))
= 0.511
if t != 1
-(0log(0.6) + 1log(1 - 0.6))
= 0.916