如何在tensorflow中表达此自定义损失函数



我有一个loss函数可以满足我的需求,但它只在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只是返回数据类型吗

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

.finfo()提供了一种获得浮点类型的机器限制的简洁方法。该功能可用于Numpy、Torch以及Tensorflow实验。

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

注意:对于整数类型,还有一个.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或类似的内容。

相关内容

  • 没有找到相关文章

最新更新