如何在TensorFlow中定义加权损失函数?

时间:2016-09-18 08:45:29

标签: python tensorflow

我有一个train_data和train_labels的训练数据集,在tensorflow图中是train_data_node和train_labels_node。 如你所知,我可以使用张量流的损失函数作为风箱:

{
  "values": {
    "value1": "StringValue",
    "value2": 123,
    "value3": "2016-09-18T18:41:48.7344837+10:00"
  }
}

但是,此丢失功能可以平等地处理所有训练数据。 但在我们的情况下,我们希望区别地处理数据。 例如,我们有一个与训练数据相对应的csv文件,以指示列车数据是原始的还是增强的。 然后我们要定义一个自定义丢失函数,它使原始数据的丢失发挥更重要的作用,并且增加数据的丢失起着不太重要的作用,例如:

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

我已将损失函数定义为以下,但它没有起作用:

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

我认为我们应该使用张量操作来编写损失函数,但是,我不熟悉它们。所以任何人都可以就如何定义损失函数给我一些建议。

感谢您的回答或建议。

1 个答案:

答案 0 :(得分:0)

我终于使用tensorflow的函数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))

如您所见,我使用numpy数组变量augs,在相应位置使用1和0来指示一批样本中的样本是增强还是非增强。然后我将变量转换为bool张量,并将其用作tf.boolen_mask()的bool掩码,以获取增强和非增广样本并分别计算损失。