Что такое буфер в Pytorch? - PullRequest
3 голосов
/ 07 января 2020

Я понимаю, что делает register_buffer и разницу между register_buffer и register_parameters .

Но каково точное определение буфера в PyTorch?

1 Ответ

2 голосов
/ 07 января 2020

Ответ можно получить, глядя на реализацию :

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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...