当前位置: 首页 > 知识库问答 >
问题:

pytorch量子化卷积中的偏置是如何工作的?

武彭薄
2023-03-14

我试图在PyTorch中执行静态训练后量化。对于这个例子,我尝试用偏置量化Conv2d层:

def quantize(model, input_shape):
    with torch.no_grad():
        # model = tq.QuantWrapper(model)
        observer = tq.PerChannelMinMaxObserver()
        model.qconfig = torch.quantization.QConfig(activation=tq.MinMaxObserver,
                                                   weight=observer.with_args(dtype=torch.qint8,
                                                                             qscheme=torch.per_channel_affine))
        #model.qconfig = torch.quantization.get_default_qconfig('qnnpack')
        model = tq.QuantWrapper(model)
        tq.prepare(model, inplace=True)

        for i in range(1000):
            x = torch.ones(2, *input_shape)
            #x = torch.randn(2, *input_shape)
            tmp = model(x)
        tq.convert(model, inplace=True)
    return model

input_shape = (5, 7, 7)
model_b = nn.Conv2d(input_shape[0], 2, 3, bias=True)
for p in model_b.parameters():
    torch.nn.init.zeros_(p)
model_b.bias.data.fill_(.5)
model_b = quantize(model_b, input_shape)
model_b.eval()

PyTorch文档明确指出,偏差不是量子化的,而是保持为浮动张量。输出的整数表示产生:

tensor([[[[255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255]],

         [[255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255],
          [255, 255, 255, 255, 255]]]], dtype=torch.uint8)

但是,浮点表示法产生:

tensor([[[[0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000]],

         [[0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
          [0.5000, 0.5000, 0.5000, 0.5000, 0.5000]]]], size=(1, 2, 5, 5),
       dtype=torch.quint8, quantization_scheme=torch.per_tensor_affine,
       scale=0.0019607844296842813, zero_point=0)

我搜索了关于这个问题的信息,得出的结论是,用于卷积输出再量化的刻度和零点考虑了偏差,并且在GEMM操作期间,偏差被量化为int32_t,然后被添加到GEMMint32_t结果中...从上述示例中,如果简单地将其转换为int32_t,则整数和浮点数输出将为0。

我的问题是:如果不转换成量子化张量,偏置如何量子化为int32_t?

共有1个答案

徐子石
2023-03-14

偏差在convert()API期间不会量化,但在推断期间会量化为int32。您可以查看aten/src/aten/native/quantized/cpu/qconv。cpp和https://zhuanlan.zhihu.com/p/299108528

 类似资料:
  • 本文向大家介绍Pytorch 实现sobel算子的卷积操作详解,包括了Pytorch 实现sobel算子的卷积操作详解的使用技巧和注意事项,需要的朋友参考一下 卷积在pytorch中有两种实现,一种是torch.nn.Conv2d(),一种是torch.nn.functional.conv2d(),这两种方式本质都是执行卷积操作,对输入的要求也是一样的,首先需要输入的是一个torch.autogr

  • 本文向大家介绍CNN中卷积和池化的作用?相关面试题,主要包含被问及CNN中卷积和池化的作用?时的应答技巧和注意事项,需要的朋友参考一下 卷积有一个重要概念是卷积核,用法是对上一层feature map进行逐块扫描进行卷积计算得到新的feature map,用于获得新的feature map,每个卷积核代表了一种特征,即从前一层提取新的特征,并且减少了参数 池化是为了防止图像特征提取中像素偏移对结果

  • 由于其简单性,我将slim框架用于tensorflow。但我想有一个卷积层,既有偏差又有批量规范化。在vanilla tensorflow中,我有: 我将其改写为slim: 但这段代码并没有给conv层添加偏差。那是因为https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/layers/python/laye

  • 主要内容:卷积神经网络深度学习是机器学习的一个分支,它是近几十年来研究人员突破的关键步骤。深度学习实现的示例包括图像识别和语音识别等应用。 下面给出了两种重要的深度神经网络 - 卷积神经网络 递归神经网络。 在本章中,我们将关注第一种类型,即卷积神经网络(CNN)。 卷积神经网络 卷积神经网络旨在通过多层阵列处理数据。这种类型的神经网络用于图像识别或面部识别等应用。 CNN与任何其他普通神经网络之间的主要区别在于CNN

  • 我对下面代码片段中的方法感到困惑。 我的困惑在于以下几行。 什么是张量。view()函数的作用是什么?我在很多地方见过它的用法,但我不明白它是如何解释它的参数的。 如果我将负值作为参数赋给函数,会发生什么情况?例如,如果我调用,? 有人能用一些例子解释一下函数的主要原理吗?

  • 我正在实现一个依赖于3D卷积的模型(对于类似于动作识别的任务),我想使用批量规范化(参见 下面的代码引用了TensorFlow r0.12,它显式地引用了变量——我的意思是我没有使用tf。承包商。学习tf以外的内容。承包商。图层。batch\u norm()函数。我这样做是为了更好地理解事情是如何运作的,并且有更多的实现自由度(例如,变量摘要)。 我将通过首先编写完全连接层的示例,然后编写2D卷积