Hello,
have recently worked with detectron2 and found that developers use nn.Module._buffers explicitly (https://github.com/facebookresearch/detectron2/blob/ef096f9b2fbedca335f7476b715426594673f463/detectron2/modeling/anchor_generator.py#L18 4). So I wanted to check will it work similar way if we use buffers() method instead.
So here’s the experiment:
import torch

class MyModule(nn.Module):
    def __init__(self):
        super().__init__()
        self.batch_norm = nn.BatchNorm1d(num_features=1)
        self.register_buffer(str('new_buf'), torch.rand(1))

    def forward(self, x):
        return x + 10

m = MyModule()
print(m._buffers.values(), m._buffers.keys())
print([el for el in m.buffers()])

This code produces the following:
odict_values([tensor([0.0600])]) odict_keys(['new_buf'])
[tensor([0.0600]), tensor([0.]), tensor([1.]), tensor(0)]

Why there is no mention of BatchNorm parameters in first case, we see only buffers added by registration? But registered is visible in second print.
Correct me if I am wrong: “One should use nn.Module.buffers() to see all buffers, and if it is needed to see just user defined use ._buffers.values() instead (user defined == registered by .register_buffer())”