YOLOv6
YOLOv6 copied to clipboard
yolov6s.pt里,部分weights里有些通道数值全为0
您好,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)
您好,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)
你好,你这个问题解决了吗?我也是提了这个问题,但是还没有回复
您好,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 好的,感谢哈 我去试一下
@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 ?