Мне трудно понять разницу между следующим:
x1 = torch.tensor([1, 2, 3]) # single brackets
x2 = torch.tensor([[1, 2, 3]]) # double brackets
При проверке их размеров:
x1.size()
и x2.size()
получаем следующее:
torch.Size([3])
torch.Size([1, 3])
Который я интерпретирую как x1
как вектор-столбец (3x1), а x2
как вектор-строку (1x3).
Однако при попытке транспонировать оба вектора:
print(x1.T)
print(x2.T)
, получаем:
tensor([1, 2, 3])
tensor([[1],
[2],
[3]])
x1
кажется, транспозиция не влияет?
Кроме того, при попытке заставить x1
быть вектором-строкой (1x3) с помощью «.view()»:
print(x1.view(1, -1))
получаем:
tensor([[1, 2, 3]]) # double brackets
Так почему же «.T» не справился с задачей, а «.view(1, -1)» смог преобразовать x1
в вектор-строку (1x3)?
Что на самом деле такое x1
, когда мы впервые присвоили его?
Согласно официальной документации -
Ожидается, что входные данные будут <= 2-D тензором и меняют местами размеры 0 и 1. 0-D и 1-D тензоры возвращаются как есть. Когда ввод представляет собой двумерный тензор, это эквивалентно транспонированию (ввод, 0, 1).
x = torch.randn(())
torch.t(x)
#tensor(0.1995)
x = torch.randn(3)
x
#tensor([ 2.4320, -0.4608, 0.7702])
torch.t(x)
#tensor([ 2.4320, -0.4608, 0.7702])
x = torch.randn(2, 3)
x
#tensor([[ 0.4875, 0.9158, -0.5872],
# [ 0.3938, -0.6929, 0.6932]])
torch.t(x)
#tensor([[ 0.4875, 0.3938],
# [ 0.9158, -0.6929],
# [-0.5872, 0.6932]])
Вот почему x1
не действует. В настоящее время это 1D-тензор, а НЕ 2D-тензор. Есть разница между формой (3,)
и (3,1)
. У первого есть только одна ось, а у другого - 2 оси (аналогично добавленным вами двойным скобкам)
Это утверждение Which I interpret as x1 being a (3x1) column vector, while x2 is a (1x3) row vector.
в некоторой степени неверно.
x1 #(3,) 1D tensor
x1.reshape((3,1) #(3,1) #2D tensor
x1.T #(1,3) 2D tensor with successful transpose
Да, вторая часть правда. Разница между представлением и изменением формы заключается в том, что изменение формы всегда копирует память, а представление никогда не копирует память. Оба имеют свои плюсы и минусы.
Великолепно! Хотя разве 2-я часть моего утверждения не верна? «в то время как x2 является вектором-строкой (1x3)». Также есть ли разница между «.view ()» и «.reshape ()»?