【问题标题】:Can we use multiple loss functions in same layer?我们可以在同一层使用多个损失函数吗?
【发布时间】:2020-11-01 19:37:30
【问题描述】:

我们可以在这个架构中使用多重损失函数吗: 我有两种不同类型的损失函数,想在最后一层使用它[输出] 损失函数:

  • binary_crossentropy
  • 自定义损失函数

我们可以这样做吗?

【问题讨论】:

    标签: tensorflow machine-learning keras deep-learning loss-function


    【解决方案1】:

    是的,您可以...您只需在模型定义中重复 2 次模型输出即可。您还可以使用 loss_weights 参数以不同的方式合并您的损失(默认为 [1,1] 用于两个损失)。下面是一个虚拟回归问题的示例。 https://colab.research.google.com/drive/1SVHC6RuHgNNe5Qj6IOtmBD5geAJ-G9-v?usp=sharing

    def rmse(y_true, y_pred):
    
        error = y_true-y_pred
    
        return K.sqrt(K.mean(K.square(error)))
    
    
    X1 = np.random.uniform(0,1, (1000,10))
    X2 = np.random.uniform(0,1, (1000,10))
    y = np.random.uniform(0,1, 1000)
    
    inp1 = Input((10,))
    inp2 = Input((10,))
    x = Concatenate()([inp1,inp2])
    x = Dense(32, activation='relu')(x)
    out = Dense(1)(x)
    
    m = Model([inp1,inp2], [out,out])
    m.compile(loss=[rmse,'mse'], optimizer='adam') # , loss_weights=[0.3, 0.7]
    history = m.fit([X1,X2], [y,y], epochs=10, verbose=2)
    

    【讨论】:

      【解决方案2】:

      您可以计算两种不同的损失。然后得到加权平均值并作为损失的最终值返回。技术上可以这样实现(就是一个例子,我没跑):

      def joint_loss(y_true, y_pred):
          part_binary_crossentropy = 0.4
          part_custom = 0.6
      
          # binary_crossentropy
          loss_binary_crossentropy = tf.keras.losses.binary_crossentropy(y_true, y_pred)
      
          # custom_loss
          loss_custom = some_custom_loss(y_true, y_pred))
      
          return part_binary_crossentropy * loss_binary_crossentropy + part_custom * loss_custom
      
      
      model.compile(loss=joint_loss, optimizer='Adam')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2011-06-07
        • 2011-03-05
        • 2019-10-16
        • 1970-01-01
        • 2020-10-24
        相关资源
        最近更新 更多