Keras metrics=[‘accuracy’]とは厳密にはどんな評価関数なのか

Kerasでディープラーニングの開発を進めていますが、よく

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

ってやってました。

しかし、ある時

metrics=['accuracy']

ってなんだ??という疑問にブチ当たりました。(´・ω・)

metrics=['acc']

も同様です。

Kerasの本家サイトによると

https://keras.io/ja/metrics/

accuracyって名前のmetricsないんですよね (;^ω^)

幸いなことに、下記のStack Overflowさんに答えがありましたー!

https://stackoverflow.com/questions/41531695/how-does-keras-define-accuracy-and-loss

デフォルトはcategorical_accuracyだそうです。

下記のKerasのソースコードを見ると、損失関数のタイプとか、出力のシェイプっぽいのを見て、binary_accuracy にしてくれることもあるようです。

https://github.com/keras-team/keras/blob/d8b226f26b35348d934edb1213061993e7e5a1fa/keras/engine/training.py#L651

しかし!はっきりしていた方がいいですから、自分で指定しておいた方が私は好きですね~。

ちなみに、勉強している元ネタ本はこちら。

PythonとKerasによるディープラーニング

無駄にややこしい部分があるので、オススメ本ではありませんw

3 Replies to “Keras metrics=[‘accuracy’]とは厳密にはどんな評価関数なのか”

  1. こんにちは。

    英語版公式ドキュメンテーション(https://keras.io/api/metrics/accuracy_metrics/)に、`Accuracy class`に対して次のような記述があります。

    > Accuracy class
    “`
    tf.keras.metrics.Accuracy(name=”accuracy”, dtype=None)
    “`
    Calculates how often predictions equal labels.

    `name`の値が`”accuracy”`になってるので、`”accuracy”`を指定したらおそらくAccuracy クラスを指すことになるのではないでしょうか。
    Accuracy classの説明は次のように続きます。

    > This frequency is ultimately returned as `binary accuracy` : an idempotent operation that simply divides `total` by `count`.

    どうやらAccuracyクラスでは、`y_pred`と`y_true`の各成分を比較し、「成分が一致した回数÷成分数」を返すようです。

    また、BinaryAccuracyクラス(nameは”binary_accuracy”)というのもあって、こちらはThreshold(閾値。たぶん、この値より上か下かが一致したら正解と判定する)という引数が存在する点がAccuracyクラスと異なります。

    またそもそも、accuracyというのは「精度」「正確度」を表す言葉ですので、当然大きければ大きいほど「喜ばしい」ものです。これに対して交差entropyというのは、Wikipediaによれば次の通りなので、小さければ小さいほど「喜ばしい」ものです。したがって、accuracyがbinary_clossentropyになることがあるというのは考えにくいのではないでしょうか。

    > 符号化方式が、真の確率分布 p ではなく、ある所定の確率分布q に基づいている場合に、とりうる複数の事象の中からひとつの事象を特定するために必要となるビット数の平均値

    以上、僕の愚行です。
    間違っていたり、要らぬ混乱を招いたようならば申し訳ございません。

  2. 平田智剛様

    お返事ありがとうございます。
    Kerasに取り組んでいたのは3年前でほとんど記憶がありませんし、検証できる環境もないのですが、記事を見ると下記の部分について言っていたと思われますね。

    acc_fn = metrics_module.binary_accuracy

    ご指摘の通り

    >下記のKerasのソースコードを見ると、損失関数のタイプとか、出力のシェイプっぽいのを見>て、binary_crossentropy にしてくれることもあるようです。

    この部分がbinary_crossentropyではなくbinary_accuracyの間違いのようです。
    記事を訂正しておきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です