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

VGG16模型对AFL类别全误判为AFIB的原因排查问询

问题解答

1. 深度学习模型确实可能出现AFL全被误判为AFIB的高度偏置情况

这种情况并非个例,核心原因包括:

  • 类别特征高度重叠:AFIB与AFL特征区分难度大,当AFL样本量不足时,模型难以捕捉其独特特征,极易将其归为特征相似的AFIB类别。
  • 单折数据分布极端:分层5折交叉验证中,部分折的AFL样本可能存在数量极少、特征代表性差的问题,导致模型在该折内完全无法区分两类。
  • 类别不平衡诱导偏向:若AFIB样本量远多于AFL,模型会优先学习样本量更大的类别特征以降低整体损失,最终出现对AFL的全误判。
  • 模型收敛不足:学习率偏小、训练轮次不足等因素,会导致模型还未学到AFL的特征就提前收敛,只能依赖已掌握的AFIB特征做预测。

2. 不一定是代码错误,但需排查以下潜在问题

从提供的代码和实验流程来看,存在几个可能加剧偏置预测的点:

(1) 全连接层激活函数选择不当

VGG结构的全连接层通常使用relu激活函数,而你选用的sigmoid在深层网络中易出现梯度消失问题,导致模型无法有效学习小样本类别(如AFL)的特征。

(2) 损失函数与标签格式不匹配

确认y_train/y_test的标签格式:

  • 若为one-hot编码,使用categorical_crossentropy是正确的;
  • 若为整数类别索引(如0-7),需改用sparse_categorical_crossentropy,否则损失计算错误会误导模型学习方向。

(3) 分层交叉验证的实现逻辑

你提到采用分层5折,但代码仅展示单折训练流程,需确认:

  • 每折的训练/测试集是否严格保持与整体一致的类别分布;
  • 折与折之间是否重新初始化模型,避免前一折权重干扰当前折训练。

(4) 学习率与训练轮次设置

设置的学习率0.00005偏小,可能导致模型收敛过慢,40轮训练不足以让模型学到AFL的特征。可尝试调高学习率(如1e-4)并增加训练轮次观察效果。

(5) 数据预处理与类别平衡

  • 检查AFL与AFIB样本的预处理是否完全一致,避免特征缩放、归一化等操作存在差异;
  • 若AFL样本量远少于AFIB,可尝试过采样AFL、欠采样AFIB,或在fit函数中设置class_weight参数平衡类别损失。

附:模型代码优化建议

def create_additional_model(input_shape=(150, 530, 1), learning_rate=0.0001):
    additional_model = Sequential()
    additional_model.add(Conv2D(input_shape=input_shape, filters=64, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
    additional_model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="same"))
    additional_model.add(Flatten())
    # 将sigmoid替换为relu,缓解梯度消失
    additional_model.add(Dense(units=512, activation="relu"))
    additional_model.add(Dense(units=256, activation="relu"))
    additional_model.add(layers.Dropout(0.5))
    additional_model.add(Dense(units=8, activation="softmax"))

    optimizer = RMSprop(lr=learning_rate, rho=0.9, epsilon=None, decay=0.0)
    additional_model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

    return additional_model

内容的提问来源于stack exchange,提问作者KYEONG HWAN LEE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:36:16