#追記:重大ミス
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