Я использую GroupNorm в pytorch вместо BatchNorm и оставляю все остальные (сетевая архитектура) без изменений.Это показывает, что в наборе данных Imagenet, использующем архитектуру resnet50, GroupNorm работает на 40% медленнее, чем BatchNorm, и потребляет на 33% больше памяти графического процессора, чем BatchNorm.Я действительно запутался, потому что GroupNorm не должен нуждаться в большем расчете, чем BatchNorm.Подробная информация приведена ниже.
Подробную информацию о нормализации группы можно найти в этом документе: https://arxiv.org/pdf/1803.08494.pdf
Для BatchNorm одна мини-партия потребляет 12,8 секунды с памятью графического процессора 7,51 ГБ;
Для GroupNorm один мини-пакет потребляет 17,9 секунды с объемом памяти графического процессора 10,02 ГБ.
Я использую следующий код для преобразования всех слоев BatchNorm в слои GroupNorm.
def convert_bn_model_to_gn(module, num_groups=16):
"""
Recursively traverse module and its children to replace all instances of
``torch.nn.modules.batchnorm._BatchNorm`` with :class:`torch.nn.GroupNorm`.
Args:
module: your network module
num_groups: num_groups of GN
"""
mod = module
if isinstance(module, nn.modules.batchnorm._BatchNorm):
mod = nn.GroupNorm(num_groups, module.num_features,
eps=module.eps, affine=module.affine)
# mod = nn.modules.linear.Identity()
if module.affine:
mod.weight.data = module.weight.data.clone().detach()
mod.bias.data = module.bias.data.clone().detach()
for name, child in module.named_children():
mod.add_module(name, convert_bn_model_to_gn(
child, num_groups=num_groups))
del module
return mod