PyTorch中torch.tensor與torch.Tensor的區別

        PyTorch最近幾年可謂大火。相比於TensorFlow,PyTorch對於Python初學者更爲友好,更易上手。

        衆所周知,numpy作爲Python中數據分析的專業第三方庫,比Python自帶的Math庫速度更快。同樣的,在PyTorch中,有一個類似於numpy的庫,稱爲Tensor。Tensor自稱爲神經網絡界的numpy。

一、numpy和Tensor二者對比

對比項 numpy Tensor
相同點 可以定義多維數組,進行切片、改變維度、數學運算等 可以定義多維數組,進行切片、改變維度、數學運算等
不同點

1、產生的數組類型爲numpy.ndarray;

2、會將ndarray放入CPU中進行運算;

3、導入方式爲import numpy as np,後續通過np.array([1,2])建立數組;

4、numpy中沒有x.type()的用法,只能使用type(x)。

1、產生的數組類型爲torch.Tensor;

2、會將tensor放入GPU中進行加速運算(如果有GPU);

3、導入方式爲import torch,後續通過torch.tensor([1,2])或torch.Tensor([1,2])建立數組;

4、Tensor中查看數組類型既可以使用type(x),也可以使用x.type()。但是更加推薦採用x.type(),具體原因詳見下文。

舉例(以下代碼均在Jupyter Notebook上運行且通過):

numpy

import numpy as np

x = np.array([1,2])

#之所以這麼寫,是爲了告訴大家,在Jupyter Notebook中,是否帶有print()函數打印出來的效果是不一樣的~

x                         #array([1, 2])
print(x)                  #[1 2]

type(x)                   #numpy.ndarray
print(type(x))            #<class 'numpy.ndarray'>

#注意:numpy中沒有x.type()的用法,只能使用type(x)!!!

Tensor

import torch               #注意,這裏是import torch,不是import Tensor!!!

x = torch.tensor([1,2])

x                          #tensor([1, 2])
print(x)                   #tensor([1, 2]),注意,這裏與numpy就不一樣了!

type(x)                    #torch.Tensor
print(type(x))             #<class 'torch.Tensor'>
x.type()                   #'torch.LongTensor',注意:numpy中不可以這麼寫,會報錯!!!
print(x.type())            #torch.LongTensor,注意:numpy中不可以這麼寫,會報錯!!!

numpy與Tensor在使用上還有其他差別。由於不是本文的重點,故暫不詳述。後續可能會更新~    

二、torch.tensor與torch.Tensor的區別

        細心的讀者可能注意到了,通過Tensor建立數組有torch.tensor([1,2])或torch.Tensor([1,2])兩種方式。那麼,這兩種方式有什麼區別呢?

        (1)torch.tensor是從數據中推斷數據類型,而torch.Tensor是torch.empty(會隨機產生垃圾數組,詳見實例)和torch.tensor之間的一種混合。但是,當傳入數據時,torch.Tensor使用全局默認dtype(FloatTensor);

        (2)torch.tensor(1)返回一個固定值1,而torch.Tensor(1)返回一個大小爲1的張量,它是初始化的隨機值。

import torch               #注意,這裏是import torch,不是import Tensor!!!

x = torch.tensor([1,2])

x                          #tensor([1, 2])
print(x)                   #tensor([1, 2]),注意,這裏與numpy就不一樣了!
type(x)                    #torch.Tensor
print(type(x))             #<class 'torch.Tensor'>
x.type()                   #'torch.LongTensor',注意:numpy中不可以這麼寫,會報錯!!!
print(x.type())            #torch.LongTensor,注意:numpy中不可以這麼寫,會報錯!!!

y = torch.Tensor([1,2])

y                          #tensor([1., 2.]),因爲torch.Tensor使用全局默認dtype(FloatTensor)
print(y)                   #tensor([1., 2.]),因爲torch.Tensor使用全局默認dtype(FloatTensor)
type(y)                    #torch.Tensor
print(type(y))             #<class 'torch.Tensor'>
y.type()                   #'torch.FloatTensor',注意:這裏就與上面不一樣了!tensor->LongTensor,Tensor->FloatTensor!!!
print(y.type())            #torch.FloatTensor,注意:這裏就與上面不一樣了!tensor->LongTensor,Tensor->FloatTensor!!!

z = torch.empty([1,2])  
   
z                          #隨機運行兩次,結果不同:tensor([[0., 0.]]),tensor([[1.4013e-45, 0.0000e+00]])
print(z)                   #隨機運行兩次,結果不同:tensor([[0., 0.]]),tensor([[1.4013e-45, 0.0000e+00]])
type(z)                    #torch.Tensor
print(type(z))             #<class 'torch.Tensor'>
z.type()                   #'torch.FloatTensor',注意:empty()默認爲torch.FloatTensor而不是torch.LongTensor
print(z.type())            #torch.FloatTensor,注意:empty()默認爲torch.FloatTensor而不是torch.LongTensor

#torch.tensor(1)、torch.Tensor(1)和torch.empty(1)的對比:
t1 = torch.tensor(1)
t2 = torch.Tensor(1)
t3 = torch.empty(1)

t1                         #tensor(1)
print(t1)                  #tensor(1)
type(t1)                   #torch.Tensor
print(type(t1))            #<class 'torch.Tensor'>
t1.type()                  #'torch.LongTenso'
print(t1.type())           #torch.LongTensor

t2                         #隨機運行兩次,結果不同:tensor([2.8026e-45]),tensor([0.])
print(t2)                  #隨機運行兩次,結果不同:tensor([2.8026e-45]),tensor([0.])
type(t2)                   #torch.Tensor
print(type(t2))            #<class 'torch.Tensor'>
t2.type()                  #'torch.FloatTensor'
print(t2.type())           #torch.FloatTensor

t3                         #隨機運行兩次,結果不同:tensor([0.]),tensor([1.4013e-45])
print(t3)                  #隨機運行兩次,結果不同:tensor([0.]),tensor([1.4013e-45])
type(t3)                   #torch.Tensor
print(type(t3))            #<class 'torch.Tensor'>
t3.type()                  #'torch.FloatTensor'
print(t3.type())           #torch.FloatTensor

        上文提到過,對於Tensor,更推薦採用x.type()來查看數據類型。是因爲x.type()的輸出結果爲'torch.LongTensor'或'torch.FloatTensor',可以看出兩個數組的種類區別。而採用type(x),則清一色的輸出結果都是torch.Tensor,無法體現類型區別。

        PyTorch是個神奇的工具,其中的Tensor用法要遠比numpy豐富。大家可以在練習中多多總結,逐漸提高~

        加油~!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章