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

Keras转PyTorch模型性能差异排查:为何结果大相径庭?

问题排查:PyTorch重实现模型全预测单一类别

针对你遇到的Keras模型正常但PyTorch重实现后全预测负类的问题,从以下几个核心匹配点逐一排查:

1. 数据预处理必须严格对齐

Keras和PyTorch模型的输入数据必须保持完全一致的预处理:

  • 检查特征归一化/标准化:如果Keras中使用了StandardScaler或MinMaxScaler对训练集做了缩放,PyTorch中必须使用同一个scaler的均值、标准差对数据做转换,不能重新拟合scaler,否则数据分布差异会导致模型无法学习。
  • 标签格式与类型:确认PyTorch中标签y的类型为float(因为BCELoss要求输入和标签同类型),且形状与Keras一致(比如都是一维数组(n_samples,))。

2. 损失函数与优化器的正确配置

  • 损失函数:Keras的binary_crossentropy对应PyTorch的nn.BCELoss(),必须确保你没有误用多分类的CrossEntropyLoss(该损失自带softmax,与你手动加的sigmoid冲突)。正确的损失定义示例:
    criterion = nn.BCELoss()
    
  • 优化器:必须将模型参数传入Adam优化器,否则权重不会更新。示例:
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # lr与Keras默认一致
    

3. 训练循环的关键细节

PyTorch训练需要手动管理梯度与迭代流程,以下是必须的步骤:

  • 每次迭代前清零梯度:optimizer.zero_grad(),否则梯度会累加导致更新异常。
  • 完整的训练步骤:
    model.train()  # 切换训练模式
    for epoch in range(100):  # 与Keras的epochs一致
        for x_batch, y_batch in dataloader:  # DataLoader需设置shuffle=True
            optimizer.zero_grad()
            outputs = model(x_batch)
            loss = criterion(outputs, y_batch.unsqueeze(1))  # 确保标签形状与输出匹配
            loss.backward()
            optimizer.step()
    
    注意:如果你的标签是一维的,输出是(batch_size,1),需要用y_batch.unsqueeze(1)调整形状匹配,否则会报维度错误。
  • 确认训练轮次与Keras一致(100个epoch),轮次不足会导致模型未收敛。

4. 混淆矩阵计算逻辑验证

检查你计算混淆矩阵的代码是否正确:
二分类任务中,需要将sigmoid输出的概率值通过阈值(通常0.5)转换为类别:

preds = (model(x_test) > 0.5).float().squeeze().numpy()

如果直接将输出值作为类别(比如取整),当模型输出全小于0.5时,会全部被判定为0类,导致混淆矩阵出现全0的第二列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:03:28