Torch.as_tensor () - это то же самое, что torch.from_ numpy () для массива numpy на ЦП? - PullRequest
2 голосов
/ 27 мая 2020

На CPU это torch.as_tensor(a) то же самое, что torch.from_numpy(a) для массива numpy, a? Если нет, то почему бы и нет?

Из документации для torch.as_tensor

, если данные представляют собой ndarray соответствующего dtype, а device - это cpu, копирование не будет выполнено.

Из документации для torch.from_numpy:

Возвращенный тензор и ndarray используют одну и ту же память. Изменения тензора будут отражены в ndarray и наоборот.

В обоих случаях любые изменения результирующего тензора изменят исходный массив numpy.

a = np.array([[1., 2], [3, 4]])
t1 = torch.as_tensor(a)
t2 = torch.from_numpy(a)
t1[0, 0] = 42.
print(a)
# prints [[42., 2.], [3., 4.]]
t2[1, 1] = 55.
print(a)
# prints [[42., 2.], [3., 55.]]

Кроме того, в обоих случаях попытка изменить размер_ тензора приводит к ошибке.

1 Ответ

0 голосов
/ 28 июля 2020

Они в основном одинаковы, за исключением того, что as_tensor более общий c:

  • В отличие от from_numpy, он поддерживает широкий диапазон типов данных, включая список, кортеж и нативные Python скаляры.
  • as_tensor поддерживает изменение dtype и device напрямую, что очень удобно на практике, поскольку dtype по умолчанию для тензора Torch - float32, а для массива Numpy - float64.

as_tensor разделяет память с исходными данными тогда и только тогда, когда исходный объект является массивом Numpy, а запрошенный dtype, если таковой имеется, совпадает с исходными данными. Это те же условия, что и в from_numpy, но всегда соблюдаются для более поздних версий.

...