caffe - 如何将 caffe 的 BatchNorm 重量转换为 pytorch BathNorm?
问题描述
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 的 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
推荐阅读
- reactjs - ReactJS:使用 if else 设置状态
- c++ - Youcompleteme 在类的方法中找不到标准库
- android - Android Room 数据库 RxJava flatmap 链请求
- regex - 将国家名称从位置列中分离出来
- string - 用于重复验证的打字稿
- node.js - 每个端口的 Socket io concurrnet 连接(Node js)是否有限制?
- java - 添加类路径后无法找到或加载 main
- android - 以编程方式获取 Google Play 商店应用程序网址
- powershell - powershell scriptblock 传递参数(查看“重复”解决方案 - 没有答案)
- c# - 使用非阻塞任务