Что делает data.norm () <1000 в PyTorch? - PullRequest
0 голосов
/ 08 июня 2018

Я следую учебнику по PyTorch здесь .Там написано, что

x = torch.randn(3, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

Out:    
tensor([-590.4467,   97.6760,  921.0221])

Может кто-нибудь объяснить, что делает data.norm () здесь?Когда я изменяю .randn на .ones, его вывод равен tensor([ 1024., 1024., 1024.]).

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Основываясь на том, что говорит @ kmario23, он умножает элементы вектора на 2 до тех пор, пока евклидово расстояние / величина вектора не станет не меньше 1000.

На примере вектора с (1,1, 1): увеличивается до (512, 512, 512), где норма l2 составляет около 886. Это меньше 1000, поэтому оно снова умножается на 2 и становится (1024, 1024, 1024).Это имеет величину больше 1000, поэтому он останавливается.

0 голосов
/ 18 января 2019
y.data.norm() 

эквивалентно

torch.sqrt(torch.sum(torch.pow(y, 2)))
0 голосов
/ 08 июня 2018

Это просто норма L2 (она же евклидова норма) тензора.Ниже приводится воспроизводимая иллюстрация:

In [15]: x = torch.randn(3, requires_grad=True)

In [16]: y = x * 2

In [17]: y.data
Out[17]: tensor([-1.2510, -0.6302,  1.2898])

In [18]: y.data.norm()
Out[18]: tensor(1.9041)

# computing the norm using elementary operations
In [19]: torch.sqrt(torch.sum(torch.pow(y, 2)))
Out[19]: tensor(1.9041)

Сначала он возводит в квадрат каждый элемент в тензор y, затем суммирует их и, наконец, получает квадратный корень.Эти операции вычисляют так называемую L2 или евклидову норму .

...