Tensorflow 2.0 Custom loss function with multiple inputs

后端 未结 3 1559
谎友^
谎友^ 2021-02-15 18:11

I am trying to optimize a model with the following two loss functions

def loss_1(pred, weights, logits):
    weighted_sparse_ce = kls.SparseCategoricalCrossentro         


        
3条回答
  •  梦谈多话
    2021-02-15 18:32

    This problem can be easily solved using custom training in TF2. You need only compute your two-component loss function within a GradientTape context and then call an optimizer with the produced gradients. For example, you could create a function custom_loss which computes both losses given the arguments to each:

    def custom_loss(model, loss1_args, loss2_args):
      # model: tf.model.Keras
      # loss1_args: arguments to loss_1, as tuple.
      # loss2_args: arguments to loss_2, as tuple.
      with tf.GradientTape() as tape:
        l1_value = loss_1(*loss1_args)
        l2_value = loss_2(*loss2_args)
        loss_value = [l1_value, l2_value]
      return loss_value, tape.gradient(loss_value, model.trainable_variables)
    
    # In training loop:
    loss_values, grads = custom_loss(model, loss1_args, loss2_args)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))
    

    In this way, each loss function can take an arbitrary number of eager tensors, regardless of whether they are inputs or outputs to the model. The sets of arguments to each loss function need not be disjoint as shown in this example.

提交回复
热议问题