keras 将两个损失与可调权重相结合
keras combining two losses with adjustable weights
所以这里是详细的描述。我有一个两层的 keras 功能模型,输出 x1 和 x2。
x1 = Dense(1,activation='relu')(prev_inp1)
x2 = Dense(2,activation='relu')(prev_inp2)
我需要使用这些 x1 和 x2,Merge/add 它们并像附图中那样提出加权损失函数。将 'same loss' 传播到两个分支。 Alpha 可以灵活地随迭代变化
似乎将"same loss"传播到两个分支都不会生效,除非alpha依赖于两个分支。如果 alpha 不依赖于两个分支而变化,那么部分损失将只是一个分支的常数。
因此,在这种情况下,只需将两个损失分开编译模型并将权重添加到编译方法中:
model.compile(optmizer='someOptimizer',loss=[loss1,loss2],loss_weights=[alpha,1-alpha])
需要改变alpha时再编译。
但如果 alpha 确实依赖于两个分支,那么您需要连接结果并计算 alpha 的值:
singleOut = Concatenate()([x1,x2])
和自定义损失函数:
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))
用这个函数编译:
model.compile(loss=weightedLoss, optimizer=....)
所以这里是详细的描述。我有一个两层的 keras 功能模型,输出 x1 和 x2。
x1 = Dense(1,activation='relu')(prev_inp1)
x2 = Dense(2,activation='relu')(prev_inp2)
我需要使用这些 x1 和 x2,Merge/add 它们并像附图中那样提出加权损失函数。将 'same loss' 传播到两个分支。 Alpha 可以灵活地随迭代变化
似乎将"same loss"传播到两个分支都不会生效,除非alpha依赖于两个分支。如果 alpha 不依赖于两个分支而变化,那么部分损失将只是一个分支的常数。
因此,在这种情况下,只需将两个损失分开编译模型并将权重添加到编译方法中:
model.compile(optmizer='someOptimizer',loss=[loss1,loss2],loss_weights=[alpha,1-alpha])
需要改变alpha时再编译。
但如果 alpha 确实依赖于两个分支,那么您需要连接结果并计算 alpha 的值:
singleOut = Concatenate()([x1,x2])
和自定义损失函数:
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))
用这个函数编译:
model.compile(loss=weightedLoss, optimizer=....)