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()を追加したほうが良さそうです。