You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras神经网络复杂输出构建:多分类概率网络融合与Softmax应用

嘿,这个问题挺贴合实际场景的——要融合「猫识别」和「猫是否戴项圈」这两个任务的概率输出,用Softmax其实可以通过两种清晰的结构实现,刚好对应你提到的网络思路,我给你拆解明白:

方案1:分层式Softmax输出(对应你说的网络结构)

这种结构是把两个任务拆成先后逻辑,每一层都用Softmax来保证概率的合理性:

  • 第一步:先做「猫/非猫」的二分类,输出层用2个神经元+Softmax激活。这一步会输出P(猫)和P(非猫),两者概率和为1,明确判断图像里有没有猫。
  • 第二步:针对第一步判定为「猫」的样本,再走第二个分支做「戴项圈/没戴项圈」的二分类,同样用2个神经元+Softmax激活。这一步输出的是条件概率P(戴项圈|猫)和P(没戴项圈|猫),两者和也为1。
  • 最终联合概率计算:把两个分支的结果结合,比如P(戴项圈的猫) = P(猫) * P(戴项圈|猫),P(没戴项圈的猫) = P(猫) * P(没戴项圈|猫),加上原有的P(非猫),三个概率总和依然为1,完全符合概率分布要求。

实现示例(PyTorch)

import torch
import torch.nn as nn

class CatCollarNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 共享特征提取层(实际项目中可以替换为卷积神经网络)
        self.feature_extractor = nn.Sequential(
            nn.Linear(224*224*3, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU()
        )
        # 猫/非猫分类分支
        self.cat_clf = nn.Sequential(
            nn.Linear(256, 2),
            nn.Softmax(dim=1)
        )
        # 项圈分类分支
        self.collar_clf = nn.Sequential(
            nn.Linear(256, 2),
            nn.Softmax(dim=1)
        )
    
    def forward(self, x):
        features = self.feature_extractor(x.flatten(1))
        cat_prob = self.cat_clf(features)
        collar_prob = self.collar_clf(features)
        return cat_prob, collar_prob

损失函数设计

  • 对于标注为「非猫」的样本:只计算猫分类分支的交叉熵损失。
  • 对于标注为「猫(戴/没戴项圈)」的样本:同时计算猫分类分支和项圈分类分支的交叉熵损失,再加权求和。
方案2:联合多分类Softmax输出

如果不想做分层逻辑,也可以把所有可能的结果整合成一个多分类任务,用单个Softmax层搞定:

  • 直接定义3个输出类别:「非猫」「没戴项圈的猫」「戴项圈的猫」,输出层设置3个神经元后接Softmax激活。这样Softmax会直接输出这三个类别的概率,总和为1,一步得到所有结果的概率分布。
  • 这种方式实现更简单,不需要处理条件损失,直接用普通的多分类交叉熵损失即可,适合样本标注明确对应这三类的场景。

实现示例(PyTorch)

class JointCatCollarNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.feature_extractor = nn.Sequential(
            nn.Linear(224*224*3, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU()
        )
        # 联合分类输出:非猫/无项圈猫/有项圈猫
        self.joint_clf = nn.Sequential(
            nn.Linear(256, 3),
            nn.Softmax(dim=1)
        )
    
    def forward(self, x):
        features = self.feature_extractor(x.flatten(1))
        joint_prob = self.joint_clf(features)
        return joint_prob

小提示

  • 分层结构的优势是逻辑清晰,能避免非猫样本干扰项圈分类的训练;联合分类的优势是实现简单,适合标注体系完善的场景。你可以根据自己的数据集标注情况选择对应方案。

内容的提问来源于stack exchange,提问作者tetanosu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:55:17