【问题标题】:How can I express this custom loss function in tensorflow?如何在张量流中表达这个自定义损失函数?
【发布时间】:2021-04-15 19:39:06
【问题描述】:

我有一个满足我需要的损失函数,但仅在 PyTorch 中。我需要将它实现到我的 TensorFlow 代码中,但是虽然其中大部分都可以简单地“翻译”,但我仍然坚持使用特定的行:

y_hat[:, torch.arange(N), torch.arange(N)] = torch.finfo(y_hat.dtype).max  # to be "1" after sigmoid

您可以在下面看到整个代码,除了那一行之外,它确实非常简单:

def get_loss(y_hat, y):
 # No loss on diagonal
 B, N, _ = y_hat.shape
 y_hat[:, torch.arange(N), torch.arange(N)] = torch.finfo(y_hat.dtype).max  # to be "1" after sigmoid

 # calc loss
 loss = F.binary_cross_entropy_with_logits(y_hat, y)  # cross entropy

 y_hat = torch.sigmoid(y_hat)
 tp = (y_hat * y).sum(dim=(1, 2))
 fn = ((1. - y_hat) * y).sum(dim=(1, 2))
 fp = (y_hat * (1. - y)).sum(dim=(1, 2))
 loss = loss - ((2 * tp) / (2 * tp + fp + fn + 1e-10)).sum()  # fscore

return loss

到目前为止,我想出了以下内容:

def get_loss(y_hat, y):
 loss = tf.keras.losses.BinaryCrossentropy()(y_hat,y)  # cross entropy (but no logits)


 y_hat = tf.math.sigmoid(y_hat)

 tp = tf.math.reduce_sum(tf.multiply(y_hat, y),[1,2])
 fn = tf.math.reduce_sum((y - tf.multiply(y_hat, y)),[1,2])
 fp = tf.math.reduce_sum((y_hat -tf.multiply(y_hat,y)),[1,2])
 loss = loss - ((2 * tp) / tf.math.reduce_sum((2 * tp + fp + fn + 1e-10)))  # fscore

return loss

所以我的问题归结为:

  • torch.finfo() 有什么作用以及如何在 TensorFlow 中表达?
  • y_hat.dtype 是否只返回数据类型?

【问题讨论】:

    标签: python tensorflow machine-learning keras pytorch


    【解决方案1】:

    1。 torch.finfo() 是做什么的,如何在 TensorFlow 中表达?

    .finfo() 提供了一种简洁的方法来获取浮点类型的机器限制。此功能在NumpyTorchTensorflow experimental 中可用。

    .finfo().max 返回可表示为该 dtype 的最大可能数字。

    注意:还有一个.iinfo() 用于整数类型。

    以下是finfoiinfo 的一些实际应用示例。

    print('FLOATS')
    print('float16',torch.finfo(torch.float16).max)
    print('float32',torch.finfo(torch.float32).max)
    print('float64',torch.finfo(torch.float64).max)
    print('')
    print('INTEGERS')
    print('int16',torch.iinfo(torch.int16).max)
    print('int32',torch.iinfo(torch.int32).max)
    print('int64',torch.iinfo(torch.int64).max)
    
    FLOATS
    float16 65504.0
    float32 3.4028234663852886e+38
    float64 1.7976931348623157e+308
    
    INTEGERS
    int16 32767
    int32 2147483647
    int64 9223372036854775807
    

    如果你想在tensorflow中实现这个,你可以使用tf.experimental.numpy.finfo来解决这个问题。

    print(tf.experimental.numpy.finfo(tf.float32))
    print('Max ->',tf.experimental.numpy.finfo(tf.float32).max)  #<---- THIS IS WHAT YOU WANT
    
    Machine parameters for float32
    ---------------------------------------------------------------
    precision =   6   resolution = 1.0000000e-06
    machep =    -23   eps =        1.1920929e-07
    negep =     -24   epsneg =     5.9604645e-08
    minexp =   -126   tiny =       1.1754944e-38
    maxexp =    128   max =        3.4028235e+38
    nexp =        8   min =        -max
    ---------------------------------------------------------------
    
    Max -> 3.4028235e+38
    

    2。 y_hat.dtype 是否只返回数据类型?

    是的。

    在torch 中,它会返回torch.float32 或类似的东西。在 TensorFlow 中,它会返回 tf.float32 或类似的东西。

    【讨论】:

    • 谢谢。所以基本上这条线将所有对角线元素设置为数据类型的最大值?代码只返回该值。由于 tensorflow 似乎只使用 tf.float32 我可以安全地使用 tf.float32.max 而不是 finfo 和 dtype 吗?
    • 正确,如果您确定 dtype 是 float32。然后tf.float32.max 将给出相同的结果。
    • 将其设置为最大值将在sigmoid 之后的对角线上给出值 1。我认为这就是他们在第一个损失函数中尝试做的事情。
    • 那么你知道为什么 PyTorch 实现中不只是 y_hat[:, torch.arange(N), torch.arange(N)] = 1 吗?
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 2019-09-20
    • 2021-02-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多