Modelo de memória PyTorch: “torch.from_numpy ()” vs “torch.Tensor ()”
Estou tentando entender profundamente como o modelo de memória do PyTorch Tensor funciona.
# 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)
Eu sei que tensores PyTorchcompartilhar o buffer de memória dos ndarrays NumPy. Assim, mudar um será refletido no outro. Então, aqui estou cortando e atualizando alguns valores no tensort2
In [98]: t2[:, 1] = 23.0
E, como esperado, é atualizado emt2
earr
pois eles compartilham o mesmo buffer de memória.
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)
Mas,t1
também é atualizado. Lembre-se dissot1
foi construído usandotorch.Tensor()
enquanto quet2
foi construído usandotorch.from_numpy()
In [100]: t1
Out[100]:
0 23
2 23
4 23
6 23
8 23
[torch.FloatTensor of size 5x2]
Então, não importa se usamostorch.from_numpy()
outorch.Tensor()
construir um tensor a partir de um ndarray,tudo esses tensores e ndarrays compartilham o mesmo buffer de memória.
Com base nesse entendimento, minha pergunta é por que uma função dedicadatorch.from_numpy()
existe quando simplesmentetorch.Tensor()
pode fazer o trabalho?
Eu olhei para a documentação do PyTorch, mas ela não menciona nada sobre isso? Alguma idéia / sugestão?