【问题标题】:Using different loss functions for different outputs simultaneously Keras?同时对不同的输出使用不同的损失函数 Keras?
【发布时间】:2018-09-10 01:10:13
【问题描述】:

我正在尝试制作一个分别输出深度图和语义分割数据的网络。

为了训练网络,我想对分割分支使用分类交叉熵,对输出深度图的分支使用均方误差。

我在功能 API 的 Keras 文档中找不到任何有关为每个分支实现两个损失函数的信息。

我是否可以在训练期间同时使用这些损失函数,或者我最好分别训练不同的分支?

【问题讨论】:

    标签: machine-learning neural-network computer-vision keras


    【解决方案1】:

    来自Model.compiledocumentation

    loss: 字符串(目标函数的名称)或目标函数。看 losses。如果模型有多个输出,您可以使用不同的 通过传递字典或损失列表来对每个输出进行损失。这 模型将最小化的损失值将是 所有个人损失。

    如果您的输出被命名,您可以使用字典将名称映射到相应的损失:

    x = Input((10,))
    out1 = Dense(10, activation='softmax', name='segmentation')(x)
    out2 = Dense(10, name='depth')(x)
    model = Model(x, [out1, out2])
    model.compile(loss={'segmentation': 'categorical_crossentropy', 'depth': 'mse'},
                  optimizer='adam')
    

    否则,使用损失列表(与相应模型输出的顺序相同)。

    x = Input((10,))
    out1 = Dense(10, activation='softmax')(x)
    out2 = Dense(10)(x)
    model = Model(x, [out1, out2])
    model.compile(loss=['categorical_crossentropy', 'mse'], optimizer='adam')
    

    【讨论】:

    • 如何为验证集使用不同的损失函数。我的意思是我正在使用减重函数来训练每个类有不同数量的示例(它是不平衡的)。但是为了验证,我不想使用加权损失。因为每个类都有统一的示例数。那么我可以为验证集传递不同的损失函数吗?
    • @W.Sam 你是如何实现它的?我认为内置的class_weight只适用于训练集。
    • 这是否意味着每个时期报告的验证损失是错误的值,因为它是基于训练损失函数的?我通过构建自定义损失函数来实现它并将这个自定义损失函数传递给损失。一种可能的解决方案是访问“正在训练”标志,该标志与 dropout 和批量标准化相关,因为这两种操作在训练和验证中具有不同的行为。但我不确定在哪里可以找到它。如果我能找到这个标志,我可以控制在每个阶段使用哪个损失。
    • 如果您没有使用class_weight 参数或样本权重,那么是的,您的验证损失由与训练损失相同的函数计算。也许您可以在自定义损失中使用K.in_train_phase() 函数。
    • 非常感谢宇阳。这就是我要找的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多