Что делает оператор * перед размером тензора в PyTorch?

Сейчас я изучаю построение нейронных сетей в 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 в документации

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


person YOLOv4    schedule 01.04.2020    source источник


Ответы (2)


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

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

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

person Crystina    schedule 02.04.2020
comment
Ваш ответ очень точен и ясен! Большое тебе спасибо! - person YOLOv4; 02.04.2020

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

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

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

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

person Ondrej K.    schedule 01.04.2020
comment
Большое спасибо! Ответ прост! - person YOLOv4; 02.04.2020