如何在Tensorflow中编写自定义丢失函数?

Gu *_*ang 28 tensorflow

我是新来的tensorflow.我想写自己的自定义丢失函数.有关于此的任何教程吗?例如,铰链损失或sum_of_square_loss(虽然这已经在tf中)?我可以直接在python中完成它,或者我必须编写cpp代码吗?

luc*_*6qi 49

我们需要记下损失函数.例如,我们可以使用基本均方误差作为预测y和目标y_的损失函数:

 loss_mse = 1/n(Sum((y-y_)^2))
Run Code Online (Sandbox Code Playgroud)

有像张量基本功能tf.add(x,y),tf.sub(x,y),tf.square(x),tf.reduce_sum(x),.

然后我们可以在Tensorflow中定义我们的损失函数,如:

cost = tf.reduce_mean(tf.square(tf.sub(y,y_)))
Run Code Online (Sandbox Code Playgroud)

注意:y和y_是张量.

此外,如果我们可以写下方程,我们可以定义任何其他损失函数.对于一些训练操作员(最小化器),损失函数应满足某些条件(平滑,可微分......).

总之,Tensorflow将数组,常量,变量定义为张量,使用tf函数定义计算,并使用会话来运行图形.我们可以定义我们喜欢的任何内容并最终运行它.


Raf*_*icz 13

除了另一个答案之外,如果可以将其表示为现有函数的组合,则可以在Python中编写损失函数.

例如,看看sigmoid_cross_entropy_with_logits 链接的实现,它是使用基本转换实现的.


Sal*_*ali 9

几乎在所有tensorflow教程中,他们都使用自定义函数.例如,在最初的教程中,他们编写了一个自定义函数:

将当前模型与提供的数据之间的增量的平方相加

squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
Run Code Online (Sandbox Code Playgroud)

在接下来的初学者MNIST中,他们使用交叉熵:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
Run Code Online (Sandbox Code Playgroud)

如你所见,它并不难:你只需要以张量格式编码你的函数并使用它们的基本功能.

例如,这里是如何实现F-beta分数(F1分数的一般方法).它的公式是:

在此输入图像描述

我们唯一需要做的就是找到如何为布尔值或0/1值计算true_positive,false_positive,false_negative.如果您有0/1值的向量,则可以将每个值计算为:

TP = tf.count_nonzero(actual, predicted)
FP = tf.count_nonzero((actual - 1) * predicted)
FN = tf.count_nonzero((predicted - 1) * actual)
Run Code Online (Sandbox Code Playgroud)

现在,一旦你了解了这些价值观,就可以轻松获得这些

denom = (1 + b**2) * TP + b**2 TN + FP
Fb = (1 + b**2) * TP / denom
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,您的 F-beta 分数实现存在多个问题: - 第一行应该是:`TP = tf.count_nonzero(actual * predictable)` - `denom = (1 + b**2) * TP + b**2 FN + FP` - 然而,这里的主要问题是这个实现不能用作自定义损失函数,因为没有办法计算梯度。例如,没有确定“预测”值的线性方法。 (3认同)

Pro*_*lma 7

def focal_loss(y_true, y_pred):
  pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
  pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))
  custom_loss=kb.square((pt_1-pt_0)/10)
  return custom_loss    

model.compile(loss=focal_loss,
          optimizer='adam',
          metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)


小智 5

我用 Kullbak-Leibler 散度实现自定义损失函数,其中 p = 常数。我在自动编码器中使用了它。

rho = 0.05

class loss_with_KLD(losses.Loss):
    
    def __init__(self, rho):
        super(loss_with_KLD, self).__init__()
        self.rho = rho
        self.kl = losses.KLDivergence()
        self.mse = losses.MeanSquaredError(reduction=tf.keras.losses.Reduction.SUM)
        
    def call(self, y_true, y_pred):
        mse = self.mse(y_true, y_pred)
        kl = self.kl(self.rho, y_pred)
        return mse + kl
Run Code Online (Sandbox Code Playgroud)

可能对任何人都有帮助。