YOLOv6 icon indicating copy to clipboard operation
YOLOv6 copied to clipboard

yolov6s.pt里,部分weights里有些通道数值全为0

Open YijiaZhao opened this issue 2 years ago • 4 comments

您好,git里提供的yolov6s.pt,有的weights的某个通道的权值全都是0, (例如backbone.stem.rbr_dense.conv.weight):

mm.backbone.stem.rbr_dense.conv.weight Parameter containing: tensor([[[[-0.0000e+00, 0.0000e+00, -0.0000e+00], [ 0.0000e+00, 0.0000e+00, -0.0000e+00], [ 0.0000e+00, 0.0000e+00, 0.0000e+00]],

     [[-0.0000e+00, -0.0000e+00, -0.0000e+00],                                                                                                                                                                         
      [ 0.0000e+00,  0.0000e+00,  0.0000e+00],                                                                                                                                                                         
      [ 0.0000e+00, -0.0000e+00, -0.0000e+00]],

     [[ 0.0000e+00,  0.0000e+00,  0.0000e+00],
      [ 0.0000e+00,  0.0000e+00,  0.0000e+00],
      [-0.0000e+00,  0.0000e+00,  0.0000e+00]]],


    [[[ 2.4023e-01, -3.3374e-01,  7.9834e-02],
      [-2.6050e-01, -2.6025e-01,  2.6196e-01],
      [-1.7290e-03,  3.2715e-01, -3.1372e-01]],

     [[ 2.6001e-01, -3.7817e-01,  1.0364e-01],                                                                                                                                                                         
      [-2.9468e-01, -2.1851e-01,  2.7295e-01],                                                                                                                                                                         
      [ 2.8152e-02,  3.5425e-01, -4.0186e-01]],

这是你们做了剪枝专门全写成0的吗?(做per_channel量化的时候,特定channel为0的话会导致量化参数scale算出为0,trt目前只能处理正数的scale,所以想问问是为啥全是0)

YijiaZhao avatar Aug 10 '22 10:08 YijiaZhao

您好,git里提供的yolov6s.pt,有的weights的某个通道的权值全都是0, (例如backbone.stem.rbr_dense.conv.weight):

mm.backbone.stem.rbr_dense.conv.weight Parameter containing: tensor([[[[-0.0000e+00, 0.0000e+00, -0.0000e+00], [ 0.0000e+00, 0.0000e+00, -0.0000e+00], [ 0.0000e+00, 0.0000e+00, 0.0000e+00]],

     [[-0.0000e+00, -0.0000e+00, -0.0000e+00],                                                                                                                                                                         
      [ 0.0000e+00,  0.0000e+00,  0.0000e+00],                                                                                                                                                                         
      [ 0.0000e+00, -0.0000e+00, -0.0000e+00]],

     [[ 0.0000e+00,  0.0000e+00,  0.0000e+00],
      [ 0.0000e+00,  0.0000e+00,  0.0000e+00],
      [-0.0000e+00,  0.0000e+00,  0.0000e+00]]],


    [[[ 2.4023e-01, -3.3374e-01,  7.9834e-02],
      [-2.6050e-01, -2.6025e-01,  2.6196e-01],
      [-1.7290e-03,  3.2715e-01, -3.1372e-01]],

     [[ 2.6001e-01, -3.7817e-01,  1.0364e-01],                                                                                                                                                                         
      [-2.9468e-01, -2.1851e-01,  2.7295e-01],                                                                                                                                                                         
      [ 2.8152e-02,  3.5425e-01, -4.0186e-01]],

这是你们做了剪枝专门全写成0的吗?(做per_channel量化的时候,特定channel为0的话会导致量化参数scale算出为0,trt目前只能处理正数的scale,所以想问问是为啥全是0)

你好,你这个问题解决了吗?我也是提了这个问题,但是还没有回复

LYHTZHANGJIANG avatar Aug 18 '22 03:08 LYHTZHANGJIANG

您好,git里提供的yolov6s.pt,有的weights的某个通道的权值全都是0, (例如backbone.stem.rbr_dense.conv.weight): mm.backbone.stem.rbr_dense.conv.weight Parameter containing: tensor([[[[-0.0000e+00, 0.0000e+00, -0.0000e+00], [ 0.0000e+00, 0.0000e+00, -0.0000e+00], [ 0.0000e+00, 0.0000e+00, 0.0000e+00]],

     [[-0.0000e+00, -0.0000e+00, -0.0000e+00],                                                                                                                                                                         
      [ 0.0000e+00,  0.0000e+00,  0.0000e+00],                                                                                                                                                                         
      [ 0.0000e+00, -0.0000e+00, -0.0000e+00]],

     [[ 0.0000e+00,  0.0000e+00,  0.0000e+00],
      [ 0.0000e+00,  0.0000e+00,  0.0000e+00],
      [-0.0000e+00,  0.0000e+00,  0.0000e+00]]],


    [[[ 2.4023e-01, -3.3374e-01,  7.9834e-02],
      [-2.6050e-01, -2.6025e-01,  2.6196e-01],
      [-1.7290e-03,  3.2715e-01, -3.1372e-01]],

     [[ 2.6001e-01, -3.7817e-01,  1.0364e-01],                                                                                                                                                                         
      [-2.9468e-01, -2.1851e-01,  2.7295e-01],                                                                                                                                                                         
      [ 2.8152e-02,  3.5425e-01, -4.0186e-01]],

这是你们做了剪枝专门全写成0的吗?(做per_channel量化的时候,特定channel为0的话会导致量化参数scale算出为0,trt目前只能处理正数的scale,所以想问问是为啥全是0)

你好,你这个问题解决了吗?我也是提了这个问题,但是还没有回复

你可以用onnx, 强行把0改成一个数: name = ['onnx::QuantizeLinear_416']

export_file = './pretrain_model/yolov6s_opt_partial_bs_opt1.onnx'
export_file_new = './pretrain_model/yolov6s_opt_partial_bs_opt1.onnx'

onnx_model = onnx.load(export_file)    

passes = ['eliminate_identity']                 
onnx_model = onnxoptimizer.optimize(onnx_model, passes)


node  = onnx_model.graph.node
for i in range(len(node)):
    for need_deal_name in name:
        if node[i].output[0] == need_deal_name:
            print(node[i])
            data = copy.deepcopy(numpy_helper.to_array(node[i].attribute[0].t))
            for k in range(len(data)):
                if data[k] == 0: data[k] = 1e-45
            node[i].attribute[0].t.CopyFrom(numpy_helper.from_array(data))
onnx.save(onnx_model, export_file_new)        

YijiaZhao avatar Aug 18 '22 03:08 YijiaZhao

@YijiaZhao 好的,感谢哈 我去试一下

LYHTZHANGJIANG avatar Aug 18 '22 03:08 LYHTZHANGJIANG

@YijiaZhao how i can use pretrain weights, in Yolov5 it used to download at its own, do we have any such parameter that can do that ?

jaideep11061982 avatar Sep 08 '22 17:09 jaideep11061982