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?

questionAnswers(3)

yourAnswerToTheQuestion