两个分类交叉熵之间的凸组合

Convex Combination between two Categorical cross entropy

我正在尝试使用分类交叉熵在 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。

我该怎么办?

我认为您需要的一切在 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)