1つの画像クラスでKerasの予測が常に100%に近いのはなぜですか?

Nov 27 2020

私はKeras(TF 2.3の上に)を使用して画像分類器をトレーニングしています。場合によっては、3つ以上のクラスがありますが、多くの場合、2つのクラス(「良い」または「悪い」)しかありません。次のように、tensorflow.keras.applications.VGG16クラスを基本モデルとして使用し、その上にカスタム分類子を配置しています。

input_layer = layers.Input(shape=(self.image_size, self.image_size, 3), name="model_input")
base_model = VGG16(weights="imagenet", include_top=False, input_tensor=input_layer)
model_head = base_model.output
model_head = layers.AveragePooling2D(pool_size=(4, 4))(model_head)
model_head = layers.Flatten()(model_head)
model_head = layers.Dense(256, activation="relu")(model_head)
model_head = layers.Dropout(0.5)(model_head)
model_head = layers.Dense(len(self.image_classes), activation="softmax")(model_head)

最後の(出力)レイヤーでわかるように、私はsoftmax活性化関数を使用しています。次に、categorical_crossentropy損失関数を使用してモデル全体をコンパイルし、ワンホットエンコードされた画像データ(ラベル)を使用してトレーニングします。

全体として、モデルは非常に良好に機能し、結果に満足しています。データセットを使用して99%を超えるテストと検証の精度を達成しています。しかし、私が理解していないことが1つあります。

predict()Kerasモデルを呼び出して予測結果を見ると、これらは常に0または1のいずれかです(または、0.000001や0.999999のように、少なくともそれに非常に近い)。したがって、私の分類子は、画像が「良い」クラスか「悪い」クラスのどちらに属しているかをかなり確信しているようです(たとえば、2つのクラスのみを使用している場合)。しかし、私は通常、これらの予測はそれほど明確ではなく、「モデルはこの画像がクラスAに属すると80%の確率で考える」という点でより明確であると想定していましたが、私の場合は常に100%です承知しました。

なぜこれが当てはまるのか、何か考えはありますか?

回答

2 nbro Nov 28 2020 at 09:20

従来のニューラルネットワークは自信過剰になる可能性があります(つまり、に近い確率を与える$0$ または $1$)それらが間違っている場合でも、それが生成する確率を不確実性の尺度として(つまり、関連する予測クラスが正しいものであると確信できる程度の尺度として)解釈するべきではありません。本質的に間違っているからです。 。これについての詳細は、これとこの回答を参照してください。

この過信は多くのシナリオで望ましくないことを考えると(医師が患者に特定の薬を与えるかどうかを決定するために、モデルがその予測についてどれほど自信があるかを知りたいヘルスケアなど)、MLコミュニティニューラルネットワークに不確実性の定量化/推定を取り入れようとしています。このトピックに興味がある場合は、Blundell et al。による論文WeightUncertainty in Neural Network(2015)を読むことができます。この論文は、特定のタイプのベイズニューラルネットワーク、つまり、の実際の値に対する不確実性をモデル化するニューラルネットワークを提案しています。重み。これから、入力に関する不確実性を定量化/推定することもできます。変分オートエンコーダの詳細にすでに精通している場合は、このペーパーを読むのはそれほど難しくありません。

したがって、あなたの質問に対する答えは次のとおりです。はい、出力確率がに近い可能性があります $1$ニューラルネットワークは自信過剰になる可能性があるためです。(tf.keraspredictメソッドによって返される値は確率であると想定しています。もう覚えていないので、間違いはないと想定しました)。

同様の質問が過去にここですでに尋ねられました。受け入れられた回答は、さまざまなタイプの不確実性と解決策に関する詳細を提供する必要があります。

1 chessprogrammer Nov 27 2020 at 06:13

データセットの性質に関する詳細がなければ、確実に知ることは不可能です。ただし、考えられる原因は次のとおりです。

  1. テストデータではなく、トレーニングデータでpredictを呼び出していました。ネットワークは、これまでに見たことのない画像よりも、トレーニングした画像についてより確実になります。

  2. モデルがデータに過剰適合しています。これは、小さなデータセットで過度に複雑なモデルを使用する場合に発生する可能性があります。正則化を試してみることをお勧めします。

  3. あなたは画像の小さすぎるサンプルを見ていました。すべての画像でpredictを実行しましたか、それとも少数の画像で実行しましたか?後者の場合、ネットワークが非常に自信を持っているサンプルを選択した可能性があります。