2017-02-10 10 views
3

私は、多数のクラス(1000)を持つマルチラベル分類のためのニューラルネットワークを訓練しています。つまり、入力ごとに複数の出力をアクティブにすることができます。平均して、出力フレームごとに2つのクラスがアクティブです。クロスエントロピー損失を伴うトレーニングでは、ニューラルネットワークは、ラベルの99.8%がゼロであるため、この出力で最小の損失しか得られないため、ゼロのみを出力します。どのように私は正のクラスに多くの重量を与えるためにネットワークをプッシュすることができます上の任意の提案?多数のクラスを持つマルチラベル分類のためのニューラルネットワークは、ゼロだけを出力します

答えて

2

Tensorflowには、損失関数weighted_cross_entropy_with_logitsがあり、これは1に大きな重みを付けるために使用できます。だからあなたのような疎なマルチラベル分類にも適用できるはずです。 documentationから

これは、そのpos_weight除くsigmoid_cross_entropy_with_logits()のようなものである一方は負の誤差に正の誤差の相対的なコストアップにより、またはダウン重み付け再現率と精度のトレードオフを可能にします。

import tensorflow as tf 
import keras.backend.tensorflow_backend as tfb 

POS_WEIGHT = 10 # multiplier for positive targets, needs to be tuned 

def weighted_binary_crossentropy(target, output): 
    """ 
    Weighted binary crossentropy between an output tensor 
    and a target tensor. POS_WEIGHT is used as a multiplier 
    for the positive targets. 

    Combination of the following functions: 
    * keras.losses.binary_crossentropy 
    * keras.backend.tensorflow_backend.binary_crossentropy 
    * tf.nn.weighted_cross_entropy_with_logits 
    """ 
    # transform back to logits 
    _epsilon = tfb._to_tensor(tfb.epsilon(), output.dtype.base_dtype) 
    output = tf.clip_by_value(output, _epsilon, 1 - _epsilon) 
    output = tf.log(output/(1 - output)) 
    # compute weighted loss 
    loss = tf.nn.weighted_cross_entropy_with_logits(targets=target, 
                logits=output, 
                pos_weight=POS_WEIGHT) 
    return tf.reduce_mean(loss, axis=-1) 
:あなたはKerasでtensorflowバックエンドを使用する場合は、あなたがこのような損失関数(Keras 2.1.1)を使用することができます

引数pos_weightは正のターゲットのための乗数として使用されています

次に、あなたのモデルに:うまく機能した値を報告し、まだ

model.compile(loss=weighted_binary_crossentropy, ...) 

私が発見していない多くのリソースクラス数、平均アクティブクラスなどとの関係でpos_weightの場合

関連する問題