Kerasの生物医学画像セグメンテーションを使用して、脳ニューロンをセグメント化しました。私はmodel.evaluate()
を使用しました。ダイス係数は0.916でした。ただし、model.predict()
を使用した場合、Dice係数を計算して予測画像をループ処理すると、Dice係数は0.82になります。これらの2つの値が異なるのはなぜですか?
問題は、Keras
のすべてのメトリックが次の方法で評価されるという事実にあります。
batch
について、メトリック値が評価されます。k
バッチの後は、計算されたk
バッチ全体のメトリックの平均値に等しくなります)。最も一般的なメトリックのほとんど(mse
、_categorical_crossentropy
_、mae
など)など-各例の損失値の平均として-そのような評価で終わるプロパティがあります適切な結果。しかし、ダイス係数の場合-すべてのバッチにわたるその値の平均は、データセット全体で計算された実際の値と等しくありません。model.evaluate()
がこのような計算方法を使用しているため、これが直接の原因です。問題。
model.evaluate
関数は、指定された入力の出力を予測し、model.compile
で指定され、y_true
とy_pred
に基づいてメトリック関数を計算し、計算されたメトリック値を出力。
model.predict
はy_pred
を返します。
したがって、model.predict
を使用して、自分でメトリックを計算すると、計算されたメトリック値はmodel.evaluate
と同じになることがわかります。
たとえば、出力を次のタイムステップで入力として入力する必要があるRNN/LSTMベースのモデルを評価する場合、model.predict
ではなくmodel.evaluate
を使用します。
keras.evaluate()
関数は、すべてのバッチの損失値を提供します。 keras.predict()
関数は、すべてのバッチについて、バッチ内のすべてのサンプルの実際の予測を提供します。したがって、同じデータを使用したとしても、損失関数の値はほとんどの場合予測値と異なるため、違いがあります。これらは2つの異なるものです。