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

如何在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);
}

关键注意点

  1. 确认张量维度:2D上采样函数要求输入为4D格式,若为3D单张图像需先扩展维度
  2. 正确获取宽高:对于(N, C, H, W)格式的张量,宽高对应索引3和2,不要混淆通道、batch与空间维度
  3. 参数二选一:始终只传递output_size或scale_factors其中一个参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:38:12