Что делает оператор "*" перед размером тензора в PyTorch? - PullRequest
2 голосов
/ 02 апреля 2020

Я сейчас учусь строить нейронные сети в PyTorch. Вот коды, вырезанные из файла .py:

x = torch.unsqueeze(torch.linspace(-1, 1, 1000), dim=1)
y = x.pow(2) + 0.1*torch.normal(torch.zeros(*x.size()))

Я весьма озадачен полезностью оператора * до x.size(). Я попытался удалить его и построить график рассеяния, который оказался таким же, как тот, у которого * не удален.

Я также проверил официальную документацию size в https://pytorch.org/docs/stable/tensors.html но я не смог понять.

Изображение предмета torch.size в документации

Буду очень признателен, если вы мне поможете.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

причина, по которой * не делает различий в результатах, заключается в том, что torch.zero за исключением обоих переменного числа аргументов и коллекции, такой как список или кортеж , как упоминалось здесь . Это не означает, что * сам по себе бесполезен.

Тогда, поскольку класс torch.Size() является подклассом кортежа python, его можно распаковать с помощью *. (x.size() вернет torch.Size() объект)

Таким образом, x.size() даст вам (1000, 1), а *x.size() в аргументе даст вам 1000, 1 и оба принимаются torch.zeros()

1 голос
/ 02 апреля 2020

* используется как это в Python обозначает (аргумент) распаковка. Когда вы добавляете его к повторяемому элементу (что возвращает x.size()), он распаковывает и (здесь) передает свои элементы в функцию в качестве позиционных аргументов. Например:

def f(a1, a2):
    print(a1, a2)

f(*["Hello", "World"])

Вы можете проверить ссылки на Документы для другого примера и более подробного описания .

...