【问题标题】:Optimizing a loss function that ignores certain label values优化忽略某些标签值的损失函数
【发布时间】:2020-01-01 18:19:12
【问题描述】:

我正在为稀疏输入数据编写二进制分类器,我想将输入 0 视为数据不存在的指示,而不是值肯定为 0 的指示。我最初使用的是tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(...)) ,但它对误报的处罚过于严厉。

我成功编写了一个损失函数,如下所示,它提供了我想要的行为,但它慢了几个数量级,我需要找到一种方法来窃取一些性能。

def loss(labels, logits):
    labels = tf.reshape(labels, shape=(-1,))
    logits = tf.reshape(logits, shape=(-1,))
    pairs = tf.stack([labels, logits], axis=1)

    return tf.reduce_mean(tf.map_fn(
        lambda x: tf.cond(
            x[0] < x[1],  # x[0] is in {0,1} and x[1] is in (0,1)
            lambda: 0.0,  # thus the condition is true iff x[0] == 0
            lambda: tf.nn.sigmoid_cross_entropy_with_logits(
                labels=x[0],
                logits=x[1])),
        pairs))

【问题讨论】:

    标签: python tensorflow optimization loss-function


    【解决方案1】:

    我相信我已经想出了一个解决方案。我突然想到,我实际上不需要对标签的数量进行归一化来获得平均值而不仅仅是总和,因此通过运行比较并将结果转换为浮点数,在条件之外创建了一个 {0,1} 掩码.然后,我使用矩阵乘法将 tf.nn.sigmoid_cross_entropy_with_logits(...) 结果与此掩码的点积相乘,以便将条件为真的值添加到总和中,而条件为假的值通过将它们乘以零来取消。

    这可能不是最好的解决方案,我会暂时搁置这个问题,以防有人可以提出更好的替代方案,使其更具惯用性或性能优势,但它为我当前的需求提供了足够的性能.

    def loss(labels, logits):
        labels = tf.reshape(labels, shape=(-1,))
        logits = tf.reshape(logits, shape=(-1,))
        output = tf.reshape(
            tf.nn.sigmoid_cross_entropy_with_logits(
                labels=labels,
                logits=logits),
            shape=(1, -1))
    
        mask = tf.reshape(
            tf.cast(labels > logits, tf.float32),  # True iff label==1
            shape=(-1, 1))
    
        return tf.matmul(output, mask)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2019-01-06
      • 2020-10-29
      相关资源
      最近更新 更多