【发布时间】: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