【问题标题】:Convex Combination between two Categorical cross entropy两个分类交叉熵之间的凸组合
【发布时间】:2020-09-28 18:49:39
【问题描述】:

我正在尝试使用分类交叉熵在 Keras 中计算自定义损失函数。 我想为两个输出(我的网络有 1 个输入和 2 个输出)创建一个独特的损失函数,即:

L= lambda*L1+(1-lambda)*L2

其中 lambda 介于 0 和 1 之间,L1 是第一个输出的分类损失熵和第二个输出的 L2... 我试过这样:

def my_loss(y_true, y_pred):
    final_loss = (0.8*(losses.binary_crossentropy(y_true[:, 0], y_pred[:, 0])+(0.2)*( losses.categorical_crossentropy(y_true[:, 1:], y_pred[:,1:]))))
    return final_loss

然后:

 model.compile(optimizer='Adam', loss=[my_loss],metrics=[metrics.categorical_accuracy])

但第一个问题是我的损失仍然是函数的 2 倍,我不知道它是否正确;另外我不能将 lambda 传递给 my_loss。

我该怎么办?

【问题讨论】:

    标签: python keras deep-learning loss-function


    【解决方案1】:

    我认为你需要的一切都在 keras 中可用

    inp = Input((10))
    x = Dense(32)(inp)
    out1 = Dense(1, activation='sigmoid', name='out1')(x)
    out2 = Dense(1, activation='sigmoid', name='out2')(x)
    
    m = Model(inp, [out1, out2])
    alpha = 0.3
    m.compile('adam', loss={'out1':'binary_crossentropy', 'out2':'binary_crossentropy'}, 
              loss_weights={'out1':alpha,'out2':1-alpha})
    
    X = np.random.uniform(0,1, (1000,10))
    y1 = np.random.uniform(0,1, 1000)
    y2 = np.random.uniform(0,1, 1000)
    
    m.fit(X, [y1,y2], epochs=10)
    

    您可以定义具有多个输出和多个损失的模型

    最终损失是您提供的损失之间的加权平均损失...loss = out1_loss * alpha + out2_loss * (1-alpha)

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 2019-07-13
      • 2021-07-17
      • 2021-03-19
      • 1970-01-01
      • 2015-04-27
      • 2020-06-04
      • 1970-01-01
      • 2018-11-03
      相关资源
      最近更新 更多