Как интерпретировать размеры тензора?

Мне трудно понять разницу между следующим:

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, когда мы впервые присвоили его?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
227
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно официальной документации -

Ожидается, что входные данные будут <= 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 ()»?

Omar AlSuwaidi 13.12.2020 09:21

Да, вторая часть правда. Разница между представлением и изменением формы заключается в том, что изменение формы всегда копирует память, а представление никогда не копирует память. Оба имеют свои плюсы и минусы.

Akshay Sehgal 13.12.2020 19:18

Другие вопросы по теме