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

LibTorch前向传播结果异常:输出维度不符及数值异常排查

问题解决思路

1. 输出张量维度错误的原因及修复

你当前的前向传播代码中,调用fc1->forward(x)时没有将返回结果赋值给x,导致后续的log_softmax是在原本240维的张量上计算,自然输出240个值,而非预期的2个。

修复后的前向传播代码:

x = torch::relu(torch::max_pool2d(conv1->forward(x), 2)); // 15 x 86x86
x = torch::relu(torch::max_pool2d(conv2->forward(x), 2)); // 30 x 42x42
x = torch::relu(torch::max_pool2d(conv3->forward(x), 2)); // 60 x 20x20
x = torch::relu(torch::max_pool2d(conv4->forward(x), 2)); // 120 x 9x9
x = torch::relu(conv5->forward(x)); // 240 x 7x7
x = torch::avg_pool2d(x, 7); // 240 x 1
x = x.view({ -1, 240 });
x = fc1->forward(x); // 关键:将全连接层的输出赋值给x
x = torch::log_softmax(x, /*dim=*/1);
return x;

2. 正确获取前向传播原始输出的方式

(1)避免直接用BYTE*访问张量数据

PyTorch的张量默认存储类型是float32(单精度浮点数),直接强制转换为BYTE*会导致浮点数被截断为字节值,得到的5、170这类数值完全没有意义。应该用对应类型的指针访问:

float* dataptr = (float*)x.data_ptr();
// 例如访问第一个元素
float first_val = dataptr[0];

(2)获取不同阶段的原始输出

  • 如果要获取全连接层的原始输出(未经过log_softmax),可以在log_softmax前保存:
    x = fc1->forward(x);
    torch::Tensor fc_output = x.clone(); // 保存全连接层原始输出
    x = torch::log_softmax(x, /*dim=*/1);
    
  • 如果要获取更前面卷积/池化层的输出,同理在对应步骤后克隆张量即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:00:09