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
相关产品推荐
相关产品推荐

