web-dev-qa-db-ja.com

二項分類CNNの最終層としてのDense(2)とDense(1)の違いは?

画像の二項分類のCNNでは、出力の形状は(画像の数、1)または(画像の数、2)のどちらにする必要がありますか?具体的には、CNNの最後のレイヤーは次の2種類です。

keras.layers.Dense(2, activation = 'softmax')(previousLayer)

または

keras.layers.Dense(1, activation = 'softmax')(previousLayer)

最初のケースでは、すべての画像に対して2つの出力値があります(グループ1に属する確率とグループ2に属する確率)。 2番目のケースでは、各画像の出力値は1つだけです。これは、そのラベルです(0または1、label = 1は、グループ1に属することを意味します)。

どちらが正しいか?本質的な違いはありますか?これらの画像内のオブジェクトを認識したくありません。2つのグループに分けてください。

どうもありがとう!

8
BuboBubo

この最初のものは正しい解決策です:

keras.layers.Dense(2, activation = 'softmax')(previousLayer)

通常、softmax活性化関数を使用して分類タスクを実行し、出力幅はカテゴリの数になります。つまり、1つのオブジェクトをラベルAB、またはCの3つのカテゴリに分類する場合は、Denseを作成する必要があります。レイヤーは、(None, 3)の形状の出力を生成します。次に、cross_entropyloss関数を使用してLOSSを計算し、勾配を自動的に計算して、バックプロパゲーションプロセスを実行できます。

Denseレイヤーで1つの値のみを生成する場合、つまり(None, 1)の形状のテンソルを取得するため、regressionのような単一の数値が生成されます。仕事。カテゴリを表すために出力の値を使用しています。答えは正しいですが、classificationタスクの一般的な解決策のようには機能しません。

5
Ember Xu

違いは、クラス確率が互いに独立しているかどうか(マルチラベル分類)です。

2つのクラスがあり、通常はP(c=1) + P(c=0) = 1がある場合

_keras.layers.Dense(2, activation = 'softmax') 

keras.layers.Dense(1, activation = 'sigmoid')
_

どちらもクラス確率の点で正しいです。唯一の違いは、トレーニング中にラベルを提供する方法です。だが

_keras.layers.Dense(2, activation = 'sigmoid')
_

その文脈では正しくありません。ただし、P(c=1) + P(c=0) != 1がある場合は、正しい実装です。これは、インスタンスが複数の正しいクラスに属している可能性があるマルチラベル分類の場合です。

0
rajesh