2016-09-18 267 views
1

我有一个train_data和train_labels的训练数据集,它是tensorflow图中的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

我发现了一些tensorflow函数来处理张量,如tf.cond(),tf.boolen_mask和tf.gather()。但我不知道如何使用它们。在我们的情况下,关键问题是如何根据由0或1组成的对应于增强和非增强的augs张量来对数据和标签张量进行切片。那么有人可以给我一个建议吗?非常感谢你。 – Kongsea

回答

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的数组变量,的AUG,在对应的位置,使用1和0以指示在一批样品的样品是否被增大或非增强。然后,我将该变量转换为布尔张量,并将其用作tf.boolen_mask()的布尔掩码来分别提取增强样本和非增量样本并计算损失。