【问题标题】:How to convert BatchNorm weight of caffe to pytorch BathNorm?如何将 caffe 的 BatchNorm 重量转换为 pytorch BathNorm?
【发布时间】:2019-04-12 03:32:22
【问题描述】:

caffe模型的BathNorm和Scale权重可以从pycaffe中读取,分别是BatchNorm中的三个权重和Scale中的两个权重。我尝试使用如下代码将这些权重复制到 pytorch BatchNorm:

if 'conv3_final_bn' == name:
    assert len(blobs) == 3, '{} layer blob count: {}'.format(name, len(blobs))
    torch_mod['conv3_final_bn.running_mean'] = blobs[0].data
    torch_mod['conv3_final_bn.running_var'] = blobs[1].data
elif 'conv3_final_scale' == name:
    assert len(blobs) == 2, '{} layer blob count: {}'.format(name, len(blobs))
    torch_mod['conv3_final_bn.weight'] = blobs[0].data
    torch_mod['conv3_final_bn.bias'] = blobs[1].data

这两个 BatchNorm 的行为不同。我也试过设置conv3_final_bn.weight=1和conv3_final_bn.bias=0来验证caffe的BN层,结果也不匹配。

匹配错误应该如何处理?

【问题讨论】:

    标签: caffe pytorch pycaffe


    【解决方案1】:

    知道了! caffe 的 BatchNorm 中还有第三个参数。代码应该是:

    if 'conv3_final_bn' == name:
        assert len(blobs) == 3, '{} layer blob count: {}'.format(name, len(blobs))
        torch_mod['conv3_final_bn.running_mean'] = blobs[0].data / blobs[2].data[0]
        torch_mod['conv3_final_bn.running_var'] = blobs[1].data / blobs[2].data[0]
    elif 'conv3_final_scale' == name:
        assert len(blobs) == 2, '{} layer blob count: {}'.format(name, len(blobs))
        torch_mod['conv3_final_bn.weight'] = blobs[0].data
        torch_mod['conv3_final_bn.bias'] = blobs[1].data
    

    【讨论】:

      猜你喜欢
      • 2018-05-21
      • 2018-06-28
      • 2021-02-09
      • 2018-04-27
      • 2020-06-27
      • 2021-02-24
      • 2020-02-09
      • 2022-10-17
      • 1970-01-01
      相关资源
      最近更新 更多