Как перевести BatchNorm вес кофе в pytorch BathNorm? - PullRequest
0 голосов
/ 12 апреля 2019

Масса модели кафе в 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, чтобы проверить уровень BN caffe, результаты тоже не совпадали.

Как мне поступить с неправильным соответствием?

1 Ответ

0 голосов
/ 12 апреля 2019

Понял! В BatchNorm есть еще третий параметр caffe. Коды должны быть:

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
...