Ответ можно получить, глядя на реализацию :
def register_buffer(self, name, tensor):
if '_buffers' not in self.__dict__:
raise AttributeError(
"cannot assign buffer before Module.__init__() call")
elif not isinstance(name, torch._six.string_classes):
raise TypeError("buffer name should be a string. "
"Got {}".format(torch.typename(name)))
elif '.' in name:
raise KeyError("buffer name can't contain \".\"")
elif name == '':
raise KeyError("buffer name can't be empty string \"\"")
elif hasattr(self, name) and name not in self._buffers:
raise KeyError("attribute '{}' already exists".format(name))
elif tensor is not None and not isinstance(tensor, torch.Tensor):
raise TypeError("cannot assign '{}' object to buffer '{}' "
"(torch Tensor or None required)"
.format(torch.typename(tensor), name))
else:
self._buffers[name] = tensor
То есть имя буфера:
- должно быть строкой:
not isinstance(name, torch._six.string_classes)
- не может содержать
.
(точка): '.' in name
- не может быть пустой строкой:
name == ''
- не может быть атрибутом модуля:
hasattr(self, name)
- должен быть уникальным:
name not in self._buffers
и tensor
(угадайте, что?):
- должен быть тензором:
isinstance(tensor, torch.Tensor)
Итак, буфер - это просто тензор с этими свойствами, зарегистрированными в атрибуте _buffers
для Module
;