喀拉拉邦结合了两个损失和可调节的重量

mad*_*avs 6 backpropagation deep-learning keras tensorflow loss-function

在此处输入图片说明

因此,这里是详细说明。我有一个带有输出x1和x2的两层的keras功能模型。

x1 = Dense(1,activation='relu')(prev_inp1)

x2 = Dense(2,activation='relu')(prev_inp2)
Run Code Online (Sandbox Code Playgroud)

我需要使用这些x1和x2(合并/添加它们),并提供加权损失函数,如所附图像中所示。将“相同损失”传播到两个分支。Alpha可以灵活地随迭代而变化

Dan*_*ler 5

似乎将“相同的损失”传播到两个分支不会生效,除非 alpha 依赖于两个分支。如果 alpha 不随两个分支而变化,则部分损失对于一个分支将是恒定的。

因此,在这种情况下,只需编译两个损失单独的模型,并将权重添加到编译方法中:

model.compile(optmizer='someOptimizer',loss=[loss1,loss2],loss_weights=[alpha,1-alpha])
Run Code Online (Sandbox Code Playgroud)

当需要改变alpha时再次编译。


但如果 alpha 确实依赖于两个分支,那么您需要连接结果并计算 alpha 的值:

singleOut = Concatenate()([x1,x2])
Run Code Online (Sandbox Code Playgroud)

以及自定义损失函数:

def weightedLoss(yTrue,yPred):
    x1True = yTrue[0]
    x2True = yTrue[1:]

    x1Pred = yPred[0]
    x2Pred = yPred[1:]

    #calculate alpha somehow with keras backend functions

    return (alpha*(someLoss(x1True,x1Pred)) + ((1-alpha)*(someLoss(x2True,x2Pred))
Run Code Online (Sandbox Code Playgroud)

使用此函数进行编译:

model.compile(loss=weightedLoss, optimizer=....)
Run Code Online (Sandbox Code Playgroud)