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

PyTorch中squeeze函数未生效求助:无法压缩独热编码张量

问题分析与解决方案

为什么squeeze(1)没效果

torch.squeeze(dim=1)的作用是仅当指定维度的大小为1时,删除该维度。你的y和output形状是(101705, 11),第二个维度的大小是11而非1,所以调用squeeze(1)不会对张量形状产生任何改变,这就是操作前后形状一致的原因。

正确处理独热编码的方式

你提到y是独热编码,而多数分类损失函数(比如CrossEntropyLoss)要求目标张量是类别索引格式(形状为(N,),每个元素是类别对应的整数),而非独热编码((N, C))。所以你需要把独热编码转换成类别索引,而非使用squeeze:

  1. 使用torch.argmax(y, dim=1)提取独热编码中最大值的索引,也就是类别标签:

    y_label = torch.argmax(y, dim=1).long()  # 转换为long类型,符合损失函数输入要求
    

    转换后y_label的形状会变成(101705,),满足损失函数的输入规范。

  2. 修改损失计算代码:

    loss += self.loss(output, y_label)
    

额外注意点

  • 确认损失函数类型:如果使用BCEWithLogitsLoss这类针对多标签/二分类的损失,目标张量确实需要独热编码格式,此时不需要转换,直接传入y即可。
  • 混淆矩阵计算需同步调整:原代码中confusion_matrix(y, torch.argmax(output, dim=1))里的y是独热编码,要替换成y_label才能和输出的类别索引匹配:
    cm = confusion_matrix(y_label.cpu().numpy(), torch.argmax(output, dim=1).cpu().numpy())
    

内容的提问来源于stack exchange,提问作者Anwar As'ad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:35:27