kerasで使うための評価指標IoUをpythonで作りました!

kerasを用いて2クラス分類タスクを解くプログラムを作成していたときのこと、

 

作成したモデルのコンパイルを行う際には

model.compile()を使用するが、

ここで用意されている引数metricsで指定できる評価指標には

binary_accuracy

binary_accuracy(y_true, y_pred)

categorical_accuracy

categorical_accuracy(y_true, y_pred)

sparse_categorical_accuracy

sparse_categorical_accuracy(y_true, y_pred)

top_k_categorical_accuracy

top_k_categorical_accuracy(y_true, y_pred, k=5)

引用元: 
評価関数 - Keras Documentation

このようなものがあります。

しかし、私の使いたいIoUという指標がない。。。

というときには、自分で関数を自作しなければなりません。

 

そもそもIoUとは、Intersection over Unionの略で、モデル評価指標の一つです。

以下の式のように定義されます。

\begin{equation}
IoU = \frac{TP}{TP+FP+FN}
\end{equation}

数式中のTPはTrue Positive、FPはFalse Positive、FNはFalse Negativeの略です。

これらについて詳しい説明はまた記事を書こうと思います。

 

これを実装した関数がこれらになります。

def true_positive(y_true, y_pred):
    return K.sum(K.cast(K.equal(y_true * y_pred, 1), K.floatx()))

def true_negative(y_true, y_pred):
    return K.sum(K.cast(K.equal(y_true + y_pred, 0), K.floatx()))

def false_positive(y_true, y_pred):
    return K.sum(K.cast(K.less(y_true, y_pred), K.floatx()))

def false_negative(y_true, y_pred):
    return K.sum(K.cast(K.greater(y_true, y_pred), K.floatx()))

def iou(y_true, y_pred):
    y_pred = K.round(y_pred)
    return true_positive(y_true, y_pred) / (false_negative(y_true, y_pred)+true_positive(y_true, y_pred)+false_positive(y_true, y_pred))

いつか使うときのために、TN(True Negative)まで作りました。

このソースの詳しい解説についても以後記事を書こうと思います。

 

以上、評価指標IoUのpythonでの実装についてでした。

他に作って欲しい指標等ありましたら、気軽にコメント欄のほうでご意見いただけると嬉しいです!

 

 

※2018/11/21追記

評価値がnanになるのを防ぐために

IoUの分母にkeras.backend.epsilon()を追加したほうが良さそうです。