如何在LibTorch中正确使用at::_upsample_nearest_exact2d?
PyTorch中
_upsample_nearest_exact2d张量resize报错的解决方法 错误原因分析
第一个错误:Must specify exactly one of output_size and scale_factors
at::_upsample_nearest_exact2d函数要求只能指定output_size(目标尺寸)和scale_factors(缩放因子)中的一个参数,不能同时传递两者。原代码同时传入了hw_t和scale_t,违反参数规则触发报错。
第二个错误:Expected static_cast<int64_t>(scale_factors->size()) == spatial_dimensions
这个错误说明缩放因子的元素数量和输入张量的空间维度数不匹配。PyTorch中2D上采样函数的空间维度数计算为输入张量维度数 - 2:
- 若输入是4D张量(
(N, C, H, W),批量图像),空间维度数为2(对应H和W),需要2个缩放因子 - 若输入是3D张量(
(C, H, W),单张图像),空间维度数为1,不符合2D上采样要求,需先扩展为4D张量 - 原代码还存在维度取值错误:
int w = size[0], h = size[1];通常会把通道数或batch数当成宽高,导致后续缩放因子计算错误。
正确解决方案
方案一:直接指定目标输出尺寸(推荐,目标尺寸固定为384x384)
先处理张量维度,确保符合2D上采样要求,再传递目标尺寸:
// 若输入是3D单张图像,先扩展为4D批量格式 if (img_tensor.dim() == 3) { img_tensor = img_tensor.unsqueeze(0); } // 获取原图像的高和宽(4D张量的第2、3位索引对应H、W) auto size = img_tensor.sizes(); int h = size[2], w = size[3]; // 指定目标输出的空间尺寸(H=384,W=384) c10::ArrayRef<int64_t> target_size({384, 384}); img_tensor = at::_upsample_nearest_exact2d(img_tensor, target_size, c10::nullopt); // 可选:转回3D单张图像格式 if (img_tensor.dim() == 4) { img_tensor = img_tensor.squeeze(0); }
方案二:使用缩放因子
同样先调整张量维度,再计算正确的缩放因子:
// 处理3D转4D if (img_tensor.dim() == 3) { img_tensor = img_tensor.unsqueeze(0); } auto size = img_tensor.sizes(); int h = size[2], w = size[3]; // 计算高和宽对应的缩放因子 double scale_h = 384.0 / h; double scale_w = 384.0 / w; c10::ArrayRef<double> scales({scale_h, scale_w}); img_tensor = at::_upsample_nearest_exact2d(img_tensor, c10::nullopt, scales); // 可选:转回3D格式 if (img_tensor.dim() == 4) { img_tensor = img_tensor.squeeze(0); }
关键注意点
- 确认张量维度:2D上采样函数要求输入为4D格式,若为3D单张图像需先扩展维度
- 正确获取宽高:对于
(N, C, H, W)格式的张量,宽高对应索引3和2,不要混淆通道、batch与空间维度 - 参数二选一:始终只传递
output_size或scale_factors其中一个参数
内容的提问来源于stack exchange,提问作者FreeToGo
相关产品推荐
相关产品推荐

