Избегает копирования данных, если исходные данные представляют собой пустой массив.
аюсь глубоко понять, как работает модель памяти PyTorch Tensor.
# input numpy array
In [91]: arr = np.arange(10, dtype=float32).reshape(5, 2)
# input tensors in two different ways
In [92]: t1, t2 = torch.Tensor(arr), torch.from_numpy(arr)
# their types
In [93]: type(arr), type(t1), type(t2)
Out[93]: (numpy.ndarray, torch.FloatTensor, torch.FloatTensor)
# ndarray
In [94]: arr
Out[94]:
array([[ 0., 1.],
[ 2., 3.],
[ 4., 5.],
[ 6., 7.],
[ 8., 9.]], dtype=float32)
Я знаю, что тензоры PyTorchразделить буфер памяти NumPy ndarrays. Таким образом, изменение одного будет отражено в другом. Итак, здесь я нарезаю и обновляю некоторые значения в Тензорt2
In [98]: t2[:, 1] = 23.0
И, как и ожидалось, он обновляется вt2
а такжеarr
так как они разделяют один и тот же буфер памяти.
In [99]: t2
Out[99]:
0 23
2 23
4 23
6 23
8 23
[torch.FloatTensor of size 5x2]
In [101]: arr
Out[101]:
array([[ 0., 23.],
[ 2., 23.],
[ 4., 23.],
[ 6., 23.],
[ 8., 23.]], dtype=float32)
Но,t1
также обновляется, Помни чтоt1
был построен с использованиемtorch.Tensor()
в то время какt2
был построен с использованиемtorch.from_numpy()
In [100]: t1
Out[100]:
0 23
2 23
4 23
6 23
8 23
[torch.FloatTensor of size 5x2]
Таким образом, независимо от того, используем ли мыtorch.from_numpy()
или жеtorch.Tensor()
построить тензор из ndarray,все такие тензоры и ndarrays совместно используют один и тот же буфер памяти.
Исходя из этого понимания, мой вопрос заключается в том, почемуtorch.from_numpy()
существует, когда простоtorch.Tensor()
может сделать работу?
Я посмотрел документацию по PyTorch, но в ней ничего не сказано? Есть идеи / предложения?