我试图用分类交叉熵来计算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倍的函数,我的损失,我不知道它是否正确; 另外,我不能把兰布达归咎于我的损失。
我该怎么做呢?
我想你所需要的一切都可以在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)
您可以定义一个具有多个输出和多个损耗的模型
最终损失是你提供的损失之间的加权平均损失。。。 损失=OUT1_损失*alpha+OUT2_损失*(1-alpha)