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

PyTorch中无法将Tensor转换为FloatTensor问题求助

解决PyTorch量化卷积中DoubleTensor转FloatTensor的问题

问题根源

你当前代码里的img.type(torch.FloatTensor)和kernel.type(torch.FloatTensor)不会修改原张量——type()方法只是返回一个转换后的新张量,并没有对原变量重新赋值,所以img和kernel依然是从numpy转来的DoubleTensor(numpy默认浮点类型是float64,对应PyTorch的DoubleTensor),导致量化时触发报错。

修正方案

直接对张量进行赋值替换,以下几种方式都可以完成类型转换:

方式1:使用to()方法指定类型

def pytorchConvolution(img, kernel):    
    img = torch.from_numpy(img).to(torch.float32)  # 直接转成FloatTensor
    kernel = torch.from_numpy(kernel).to(torch.float32)

    dtype_inputs = torch.quint8
    dtype_filters = torch.qint8
    
    scale, zero_point = 1.0, 0
    q_filters = torch.quantize_per_tensor(kernel, scale, zero_point, dtype_filters)
    q_inputs = torch.quantize_per_tensor(img, scale, zero_point, dtype_inputs)
    bias = torch.randn(8, dtype=torch.float)
     
    print(img.type())  # 此时会输出torch.FloatTensor
    
    convolution2d = qF.conv2d(q_inputs, q_filters, bias)  
    return convolution2d

方式2:使用float()方法简化转换

float()是to(torch.float32)的快捷写法,代码更简洁:

def pytorchConvolution(img, kernel):    
    img = torch.from_numpy(img).float()
    kernel = torch.from_numpy(kernel).float()

    # 后续代码保持不变
    dtype_inputs = torch.quint8
    dtype_filters = torch.qint8
    
    scale, zero_point = 1.0, 0
    q_filters = torch.quantize_per_tensor(kernel, scale, zero_point, dtype_filters)
    q_inputs = torch.quantize_per_tensor(img, scale, zero_point, dtype_inputs)
    bias = torch.randn(8, dtype=torch.float)
     
    print(img.type())
    
    convolution2d = qF.conv2d(q_inputs, q_filters, bias)  
    return convolution2d

方式3:转换numpy数组类型后再转张量

如果想从源头避免类型问题,可以先把numpy数组转成float32,再转PyTorch张量:

# 调用代码修改
blur_filter = (1/250)*np.ones([5, 5], dtype=np.float32)
img = img.astype(np.float32)  # 假设原img是numpy数组
img_blurred_py = pytorchConvolution(img, blur_filter)

# 函数内可以简化为
def pytorchConvolution(img, kernel):    
    img = torch.from_numpy(img)
    kernel = torch.from_numpy(kernel)
    # 此时张量已经是FloatTensor,无需额外转换
    # 后续代码保持不变

验证效果

修改后运行代码,print(img.type())会输出torch.FloatTensor,量化操作可以正常执行,不会再触发Quantize only works on Float Tensor的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:18:25