2017-11-29 3 views
0

ケラスでは、入力ごとに1-1を出力すると予想されるバイナリクラシファイアを設計しています。出力が0または1の場合、私はbinary_crossentropyを損失関数として使用できます。私は、出力を1-1に変更するとその話は変わらないと思ったが、パフォーマンスは良くなかった。これは、損失関数binary_crossentropyは、01ラベルでのみ機能するのでしょうか?Kerasで1と-1を出力するバイナリクラシファイアを設計する方法

私も01場合のために、最後の層の出力が実際に01至るまでされているので、この問題を解決する別の方法が存在する知っています。だから私は-11の要件を満たすために出力のリスケールを行うことができましたが、私が単純に-11を出力する方法を見つけ出すことができれば、より良いでしょう。

答えて

1

クロスエントロピーは、ターゲットベクトルyのすべての要素(1を除く)が0であるため、正しいものではないすべてのアクティベーションのグラデーションを無効にし、プロセスを安定させます。

どちらでき:

  1. 使用tanh活性化([-1、1]の範囲内の出力)とmse損失:
x = Input(...) 

y = Dense(128, activation='relu')(x) 
y = Dense(128, activation='relu')(y) 
y = Dense(1, activation='tanh')(y) 

model = Model(inputs=x, outputs=y) 
model.compile(optimizer='adam', loss='mse') 

# train model using labels in {-1, 1} 
# outputs values are in [-1, 1] 
  • シグモイドを訓練し、あなたのロジットをスケールします。これは、私には、より合理的なようだ:
  • x = Input(...) 
    
    y = Dense(128, activation='relu')(x) 
    y = Dense(128, activation='relu')(y) 
    y = Dense(1, activation='sigmoid')(y) 
    
    model = Model(inputs=x, outputs=y) 
    model.compile(optimizer='adam', loss='binary_crossentropy') 
    
    # train model using labels in {0, 1} 
    
    z = Lambda(lambda _y: _y/2 + .5)(y) 
    model = Model(inputs=x, outputs=z) 
    
    # outputs values are in [-1, 1] 
    

    注:あなたが見て、その後、(2枚の画像が同じオブジェクトが含まれている場合などは区別)シャムネットワークと空間に二つのことを区別しようとしている場合コントラスト・ロスの定義はmnist-siamese exampleです。私の経験は、どの出力よりもはるかに優れているということです。sigma/tanh出力。

    1

    あなたが正しいです、binary_corssentropyは、0と1のラベルでのみ動作します。 2つのクラスが猫と犬であるとすると、観測データX1はcatとラベル付けされています。ラベルは、地面真理級確率y =(1.0,0)Tと見なすことができ、確率分布の第1要素入力データがクラス1である確率を表します。この場合、絶対的にcatです。モデルは異なる分布、例えばy^=(0.8,0.2)を予測し、y ^をyに近づけるようにパラメータを調整する必要がある。 yとyの差を測定するのにbinary_crossentropyを使用します。 Cross Entropy

    H(y、y)はクロスエントロピーである。

    私はTendorflowでKerasをバックエンドとして使用していますが、tf.nn.sigmoid_cross_entropy_with_logitsはKerasでbechind binary_crossentropyと呼ばれていました。

    テンソルフローのシグモイドクロス総エントロピーの導入の処方によれば、ラベルは(0,1)の範囲の実数でなければならず、ラベルはグラウンド真理確率分布を表し、通常観測値は0と1です。

    願っています。

    関連する問題