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

