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

基于Pyro与PyTorch的贝叶斯CNN手语分类模型预测问题求解

贝叶斯CNN手语图像分类的正确预测方法

问题根源

你的预测代码存在3个核心问题:

  • 错误将训练用的观测变量obs纳入预测返回站点,冗余且干扰结果判断
  • 仅对logits均值取argmax,未利用贝叶斯模型多权重采样的特性获取鲁棒结果
  • 训练轮次过少(仅5轮)、学习率过高(0.03),可能导致模型未充分拟合

修正方案

1. 优化训练环节(可选但关键)

先调整训练参数,确保模型具备基础拟合能力:

num_iterations = 30  # 提升训练轮次至合理范围
optim = pyro.optim.Adam({"lr": 0.005})  # 降低学习率避免震荡

2. 正确的预测流程

步骤1:初始化Predictive工具

仅关注模型生成的类别采样(obs),无需返回冗余的训练观测变量:

# 切换模型到评估模式(若模型包含BN/Dropout层必须执行)
model.eval()

# 初始化预测器,增加采样数提升结果鲁棒性
predictive = pyro.infer.Predictive(
    model=model,
    guide=guide,
    num_samples=50,  # 推荐50-100次采样
    return_sites=("obs",)  # 只获取类别采样结果
)

步骤2:预处理输入图像

确保输入维度与训练时完全一致(需包含batch和通道维度):

# 假设单张输入图像形状为(H, W),需转为(1, 1, H, W)
# 若输入是PIL图像,需执行与训练阶段一致的归一化、尺寸调整等操作
image = image.unsqueeze(0).unsqueeze(0)  # 添加batch和通道维度

步骤3:执行预测并统计结果

采用多数投票(贝叶斯模型的标准预测方式)确定最终分类:

with torch.no_grad():  # 禁用梯度计算,加速预测过程
    samples = predictive(image)

# 提取所有采样的类别结果,形状为(num_samples, batch_size)
pred_samples = samples["obs"].squeeze()  # 去掉冗余的batch维度,转为(num_samples,)

# 多数投票:取出现次数最多的类别
pred_label = torch.mode(pred_samples).values.item()

# 输出结果
print(f"真实标签: {label.item()}")
print(f"预测标签: {pred_label}")

备选方案:基于logits均值的预测

若需要观察后验概率分布,可返回模型输出的logits,取均值后计算最大概率类别:

predictive = pyro.infer.Predictive(
    model=model,
    guide=guide,
    num_samples=50,
    return_sites=("_RETURN",)  # 返回模型输出的logits
)

with torch.no_grad():
    samples = predictive(image)

# 对所有采样的logits取均值
logits_mean = torch.mean(samples["_RETURN"], dim=0)
# 取概率最大的类别
pred_label = torch.argmax(logits_mean, dim=1).item()

额外注意事项

  • 检查模型定义中是否包含必要的激活函数(如ReLU)和池化层(如MaxPool2d),原代码中# rest of the codes部分若缺失这些层,会直接导致模型拟合能力极差
  • 输入图像的预处理流程(归一化、尺寸、通道数)必须与训练阶段完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:50:23