web-dev-qa-db-ja.com

Keras model.evaluate()とmodel.predict()の違いは何ですか?

Kerasの生物医学画像セグメンテーションを使用して、脳ニューロンをセグメント化しました。私はmodel.evaluate()を使用しました。ダイス係数は0.916でした。ただし、model.predict()を使用した場合、Dice係数を計算して予測画像をループ処理すると、Dice係数は0.82になります。これらの2つの値が異なるのはなぜですか?

11
Saeed Alahmari

問題は、Kerasのすべてのメトリックが次の方法で評価されるという事実にあります。

  1. batchについて、メトリック値が評価されます。
  2. 損失の現在の値(kバッチの後は、計算されたkバッチ全体のメトリックの平均値に等しくなります)。
  3. 最終結果は、すべてのバッチについて計算されたすべての損失の平均として得られます。

最も一般的なメトリックのほとんど(mse、_categorical_crossentropy_、maeなど)など-各例の損失値の平均として-そのような評価で終わるプロパティがあります適切な結果。しかし、ダイス係数の場合-すべてのバッチにわたるその値の平均は、データセット全体で計算された実際の値と等しくありません。model.evaluate()がこのような計算方法を使用しているため、これが直接の原因です。問題。

9
Marcin Możejko

model.evaluate関数は、指定された入力の出力を予測し、model.compileで指定され、y_truey_predに基づいてメトリック関数を計算し、計算されたメトリック値を出力。

model.predicty_predを返します。

したがって、model.predictを使用して、自分でメトリックを計算すると、計算されたメトリック値はmodel.evaluateと同じになることがわかります。

たとえば、出力を次のタイムステップで入力として入力する必要があるRNN/LSTMベースのモデルを評価する場合、model.predictではなくmodel.evaluateを使用します。

8
javac

keras.evaluate()関数は、すべてのバッチの損失値を提供します。 keras.predict()関数は、すべてのバッチについて、バッチ内のすべてのサンプルの実際の予測を提供します。したがって、同じデータを使用したとしても、損失関数の値はほとんどの場合予測値と異なるため、違いがあります。これらは2つの異なるものです。

6