PyTorch中torch.tensor與torch.Tensor的區(qū)別詳解
PyTorch最近幾年可謂大火。相比于TensorFlow,PyTorch對(duì)于Python初學(xué)者更為友好,更易上手。
眾所周知,numpy作為Python中數(shù)據(jù)分析的專業(yè)第三方庫(kù),比Python自帶的Math庫(kù)速度更快。同樣的,在PyTorch中,有一個(gè)類似于numpy的庫(kù),稱為Tensor。Tensor自稱為神經(jīng)網(wǎng)絡(luò)界的numpy。
一、numpy和Tensor二者對(duì)比
對(duì)比項(xiàng) | numpy | Tensor |
相同點(diǎn) | 可以定義多維數(shù)組,進(jìn)行切片、改變維度、數(shù)學(xué)運(yùn)算等 | 可以定義多維數(shù)組,進(jìn)行切片、改變維度、數(shù)學(xué)運(yùn)算等 |
不同點(diǎn) |
1、產(chǎn)生的數(shù)組類型為numpy.ndarray; 2、會(huì)將ndarray放入CPU中進(jìn)行運(yùn)算; 3、導(dǎo)入方式為import numpy as np,后續(xù)通過(guò)np.array([1,2])建立數(shù)組; 4、numpy中沒有x.type()的用法,只能使用type(x)。 |
1、產(chǎn)生的數(shù)組類型為torch.Tensor; 2、會(huì)將tensor放入GPU中進(jìn)行加速運(yùn)算(如果有GPU); 3、導(dǎo)入方式為import torch,后續(xù)通過(guò)torch.tensor([1,2])或torch.Tensor([1,2])建立數(shù)組; 4、Tensor中查看數(shù)組類型既可以使用type(x),也可以使用x.type()。但是更加推薦采用x.type(),具體原因詳見下文。 |
舉例(以下代碼均在Jupyter Notebook上運(yùn)行且通過(guò)):
numpy:
import numpy as np x = np.array([1,2]) #之所以這么寫,是為了告訴大家,在Jupyter Notebook中,是否帶有print()函數(shù)打印出來(lái)的效果是不一樣的~ 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中不可以這么寫,會(huì)報(bào)錯(cuò)?。?! print(x.type()) #torch.LongTensor,注意:numpy中不可以這么寫,會(huì)報(bào)錯(cuò)?。?!
numpy與Tensor在使用上還有其他差別。由于不是本文的重點(diǎn),故暫不詳述。后續(xù)可能會(huì)更新~
二、torch.tensor與torch.Tensor的區(qū)別
細(xì)心的讀者可能注意到了,通過(guò)Tensor建立數(shù)組有torch.tensor([1,2])或torch.Tensor([1,2])兩種方式。那么,這兩種方式有什么區(qū)別呢?
(1)torch.tensor是從數(shù)據(jù)中推斷數(shù)據(jù)類型,而torch.Tensor是torch.empty(會(huì)隨機(jī)產(chǎn)生垃圾數(shù)組,詳見實(shí)例)和torch.tensor之間的一種混合。但是,當(dāng)傳入數(shù)據(jù)時(shí),torch.Tensor使用全局默認(rèn)dtype(FloatTensor);
(2)torch.tensor(1)返回一個(gè)固定值1,而torch.Tensor(1)返回一個(gè)大小為1的張量,它是初始化的隨機(jī)值。
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中不可以這么寫,會(huì)報(bào)錯(cuò)?。?! print(x.type()) #torch.LongTensor,注意:numpy中不可以這么寫,會(huì)報(bào)錯(cuò)?。?! y = torch.Tensor([1,2]) y #tensor([1., 2.]),因?yàn)閠orch.Tensor使用全局默認(rèn)dtype(FloatTensor) print(y) #tensor([1., 2.]),因?yàn)閠orch.Tensor使用全局默認(rèn)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 #隨機(jī)運(yùn)行兩次,結(jié)果不同:tensor([[0., 0.]]),tensor([[1.4013e-45, 0.0000e+00]]) print(z) #隨機(jī)運(yùn)行兩次,結(jié)果不同: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()默認(rèn)為torch.FloatTensor而不是torch.LongTensor print(z.type()) #torch.FloatTensor,注意:empty()默認(rèn)為torch.FloatTensor而不是torch.LongTensor #torch.tensor(1)、torch.Tensor(1)和torch.empty(1)的對(duì)比: 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 #隨機(jī)運(yùn)行兩次,結(jié)果不同:tensor([2.8026e-45]),tensor([0.]) print(t2) #隨機(jī)運(yùn)行兩次,結(jié)果不同: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 #隨機(jī)運(yùn)行兩次,結(jié)果不同:tensor([0.]),tensor([1.4013e-45]) print(t3) #隨機(jī)運(yùn)行兩次,結(jié)果不同: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
上文提到過(guò),對(duì)于Tensor,更推薦采用x.type()來(lái)查看數(shù)據(jù)類型。是因?yàn)閤.type()的輸出結(jié)果為'torch.LongTensor'或'torch.FloatTensor',可以看出兩個(gè)數(shù)組的種類區(qū)別。而采用type(x),則清一色的輸出結(jié)果都是torch.Tensor,無(wú)法體現(xiàn)類型區(qū)別。
PyTorch是個(gè)神奇的工具,其中的Tensor用法要遠(yuǎn)比numpy豐富。大家可以在練習(xí)中多多總結(jié),逐漸提高~
到此這篇關(guān)于PyTorch中torch.tensor與torch.Tensor的區(qū)別詳解的文章就介紹到這了,更多相關(guān)PyTorch中torch.tensor與torch.Tensor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中@property的作用和getter setter的解釋
這篇文章主要介紹了python中@property的作用和getter setter的解釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12pytorch 圖像中的數(shù)據(jù)預(yù)處理和批標(biāo)準(zhǔn)化實(shí)例
今天小編就為大家分享一篇pytorch 圖像中的數(shù)據(jù)預(yù)處理和批標(biāo)準(zhǔn)化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01在python shell中運(yùn)行python文件的實(shí)現(xiàn)
今天小編就為大家分享一篇在python shell中運(yùn)行python文件的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python關(guān)于多值參數(shù)的實(shí)例詳解
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python關(guān)于多值參數(shù)的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-07-07Python語(yǔ)言描述連續(xù)子數(shù)組的最大和
這篇文章主要介紹了Python語(yǔ)言描述連續(xù)子數(shù)組的最大和,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python DNS查詢放大攻擊實(shí)現(xiàn)原理解析
這篇文章主要介紹了Python DNS查詢放大攻擊實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10教你使用Python寫一個(gè)簡(jiǎn)單的JSONParser
這篇文章主要介紹了教你使用Python寫一個(gè)簡(jiǎn)單的JSONParser,它的整個(gè)效果,有點(diǎn)類似于 python 標(biāo)準(zhǔn)庫(kù) json 的 json.load() 方法,需要的朋友可以參考下2023-04-04