2016-09-18 12 views
1

私はtrain_dataとtrain_labelsのトレーニングデータセットを持っています。これはtrain_data_nodeとtrain_labels_nodeがテンソルフローのグラフにあります。ご存知のように 、私はベローズとしてtensorflowの損失関数を使用することができます。TensorFlowで加重損失関数を定義する方法は?

logits = model(train_data_node) 
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
    logits,train_labels_node)) 

しかし、この損失関数は均等にすべてのトレーニングデータを処理します。 私たちの状況では、データを差別的に処理したいと考えています。 たとえば、トレーニングデータに対応するcsvファイルがあり、列車データが元のデータまたは増強されたデータであることが示されます。私は怒鳴るように損失関数を定義した

loss_no_aug = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(noAugLogits, noAugLabels)) 
loss_aug = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels)) 
loss = loss_no_aug * PENALTY_COEFFICIENT + loss_aug 

: はその後、我々は、元のデータの損失がより重要な役割とのような、拡張データ演じるそれほど重要な役割の喪失を果たしますカスタム損失関数を定義したいですが、それはうまくいきませんでした:

def calLoss(logits, labels, augs): 
    noAugLogits = [] 
    noAugLabels = [] 
    augLogits = [] 
    augLabels = [] 
    tf.get_collection() 
    for i in range(augs.shape[0]): 
    if augs[i] == 1: 
     noAugLogits.append(logits[i]) 
     noAugLabels.append(labels[i]) 
    else: 
     augLogits.append(logits[i]) 
     augLabels.append(labels[i]) 
    noAugLogits = tf.convert_to_tensor(noAugLogits) 
    noAugLabels = tf.convert_to_tensor(noAugLabels) 
    augLogits = tf.convert_to_tensor(augLogits) 
    augLabels = tf.convert_to_tensor(augLabels) 
    return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
     noAugLogits, noAugLabels)) * PENALTY_COEFFICIENT + \ 
     tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels)) 

私たちはしかし、私は彼らに慣れていない午前、テンソル演算を使用して損失関数を記述するべきだと思います。だから誰も私にどのように損失機能を定義するためのいくつかのアドバイスを与えることができます。

ご回答ありがとうございます。

+0

私は、tf.cond()、tf.boolen_mask、tf.gather()などのテンソルを処理するテンソルフローの関数をいくつか見つけました。しかし、私はそれらを使う方法を知らない。そして、私たちの状況では、重要な問題は、データをスライスしてテンソルをどのように拡大し、オーグメンテーションと非オーギュメントに対応するテンソルを0または1で構成するかということです。誰も私に提案をすることができますか?どうもありがとうございました。 – Kongsea

答えて

0

私は最終的にテンソルフローの関数tf.boolen_mask()を使用して自分でこの問題を解決しました。定義されたカスタム加重損失関数は、ベローズの通りです:

def calLoss(logits, labels, augs): 
    augSum = tf.reduce_sum(augs) 
    pred = tf.less(augSum, BATCH_SIZE) 

    def noaug(logits, labels, augs): 
    augs = tf.cast(augs, tf.bool) 
    noaugs = tf.logical_not(augs) 
    noAugLogits = tf.boolean_mask(logits, noaugs) 
    noAugLabels = tf.boolean_mask(labels, noaugs) 
    augLogits = tf.boolean_mask(logits, augs) 
    augLabels = tf.boolean_mask(labels, augs) 
    noaugLoss = tf.reduce_mean(
     tf.nn.sparse_softmax_cross_entropy_with_logits(noAugLogits, noAugLabels)) 
    augLoss = tf.reduce_mean(
     tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels)) 
    return noaugLoss * PENALTY_COEFFICIENT + augLoss 

    def aug(logits, labels): 
    return tf.reduce_mean(
     tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)) 

    return tf.cond(pred, lambda: noaug(logits, labels, augs), lambda: aug(logits, labels)) 

あなたが見ることができるように、私はサンプルのバッチ内のサンプルが強化されているかどうかを示すために、対応する位置での1と0を使用して、のAUG、numpyの配列変数を使用しますまたは増強されていない。変数をboolテンソルに変換し、tf.boolen_mask()のboolマスクとして使用して、拡張サンプルと非拡張サンプルをフェッチし、それぞれ損失を計算します。

関連する問題