2017-08-21 13 views
0

バイナリクラシファイドで約98%の精度が得られるシグモイド活性化関数を使ってバイナリクラシファイアをトレーニングしています。
categorical_crossentropyでsoftmaxを使用してトレーニングした場合と同じは、精度が非常に低い(< 40%)。
binary_crossentropyのターゲットを0と1のリストとして渡しています。 [0,1,1,1,0]。ソフトマックスでのバイナリ分類

これはなぜ起こっているのですか?

これは、私は2番目の分類器のために使用していたモデルです。今 enter image description here

+1

についての詳細情報を見つけてください、あなたは私たちにあなたが使用したコードを示していただけますか?たぶん答えはあなたの説明に隠されています。私の推測では、40%の精度はランダムバイナリクラシファイアよりも最悪であるため、第2のクラシファイアには正式に2つ以上のクラスが存在すると思います。 –

+1

あなたに適したソリューションを見つけたら、その答えの横のチェックマークをクリックして受け入れてください。これにより、あなたの問題を抱えている他の人たちが、あなたに適したソリューションを知ることができます –

答えて

3

それだけで一つのクラスの間であなたの最後の層の出力(数を選択することができますように、あなたの第2のモデルは、常に「クラス0」に答えます)。

2つのクラスがあるので、2つの出力でsoftmax + categorical_crossentropyを計算して、最も可能性の高いものを選択する必要があります。

したがって、あなたの最後の層は次のようになります。

model.add(Dense(2, activation='softmax') 
model.compile(...) 

ちょうど単一の出力数を解析することにより、真のが「クラス0」の確率を計算あなたのシグモイド+ binary_crossentropyモデルは、すでに正しいです。

EDIT:ここでは実数空間と確率空間との間のマッピングとして表示することができますSigmoid機能

シグモイド程度の小さな説明です。

Sigmoid Function

ことに注意してください:実数、ネットワークの出力は、非常に低いのであれば

Sigmoid(-infinity) = 0 
Sigmoid(0) = 0.5 
Sigmoid(+infinity) = 1 

、シグモイドは、「クラス0」の確率は0に近いかを決定します"Class 1"を決定する
逆に、ネットワークの出力が非常に高い場合、Sigmoidは "Class 0"が1に近い確率を決定し、 "Class 0"を決定します。

決定私あなたの出力の看板を見るだけで、クラスを決定するのと同様のことです。しかし、これはあなたのモデルが学ぶのを許さないでしょう!確かに、このバイナリ損失の勾配はほぼすべての場所でゼロになり、適切に定量化されないため、モデルがエラーから学習することは不可能になります。

シグモイドと「binary_crossentropy」が使用されている理由は次のとおりです。
これらはバイナリロスの代理であり、スムーズなプロパティがあり、学習が可能です。

また、Softmax FunctionCross Entropy

+0

私は今論理を理解しています。しかし、Sigmoidはどのようにして1つの出力だけで動作しましたか? –

+1

@AKSHAYAAVAIDYANATHAN私は自分の投稿を編集しました。 –

+1

また、1と0のリストではなく、カテゴリクロスジェクトの形式 - > [[0,1]、[1,0]]の出力があることがわかった –

関連する問題