首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非线性损耗组合

非线性损耗组合
EN

Stack Overflow用户
提问于 2019-06-19 13:35:38
回答 1查看 62关注 0票数 2

我的网络有两个输出。我试图在两个条件上有一个损失,这不是两个损失的线性和:

代码语言:javascript
复制
def weightedBCE(y_true, y_pred):
    assert y_pred.shape[2] == 2
    y_pred_val = y_pred[:,:,0]
    stds = y_pred[:,:,1]
    bce = K.binary_crossentropy(y_true, y_pred_val)
    loss = bce * (1. + LAM*stds )
    return loss

我的模型的最后层定义如下(outSall有3个值):

代码语言:javascript
复制
std = make_std_model()(outSall)
final = Dense(1, activation="sigmoid")(outSall)

output = concatenate([DSAfinal, std ], axis=-1)

但是它不起作用,因为Kears预计每输出有一个损失函数。我的损失一起使用网络的两个输出。

第一个输出是具有二进制交叉熵损失的标准分类,但我希望它乘以(1+ LAM* stds)和一个λ因子乘以stdsstds是网络的第二个输出。

我该怎么做?

断言y_pred.shape2 == 2 IndexError:列出超出范围的索引

更新:我有一个额外的索引,现在修正了。见下文。但下面贴错了。

代码语言:javascript
复制
def weightedBCE(y_true, y_pred):
    assert y_pred.shape[1] == 2
    y_pred_val = y_pred[:,0]
    stds = y_pred[:,1]
    bce = K.binary_crossentropy(y_true, y_pred_val)
    loss = bce * (1. + LAM*stds )
    return loss

ValueError: logits和标签必须具有相同的形状((?,) vs ( ?)

Update2:

Keras假设y_true具有与y_pred相同的形状。这就是问题所在。将损失改为:

代码语言:javascript
复制
def weightedBCE(y_true, y_pred):
    assert y_pred.shape[1] == 2
    y_pred_val = y_pred[:,0]
    stds = y_pred[:,1]
    bce = K.binary_crossentropy(y_true[:,0], y_pred_val)
    loss = bce * (1. + LAM*stds )
    return loss

处理两个输出仍然存在一些问题,请参阅Binary Cross Entropy not giving similar results when I have 2 outputs

EN

回答 1

Stack Overflow用户

发布于 2019-06-19 13:54:23

与创建具有两个输出的Keras模型不同的是,创建一个具有单个输出的Keras模型,它是两个张量的连接(可以使用keras.layers.Concatenate )。然后,您可以像上面所写的那样,使用单个自定义丢失函数来编译模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56668996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档