Pytorch創(chuàng)建張量的四種方法
一、Pytorch創(chuàng)建張量的4種方法
Pytorch創(chuàng)建張量的4種方法主要有:torch.Tensor()、torch.tensor()、torch.as_tensor()、torch.from_numpy()。具體使用方法如下方代碼。其中torch.Tensor()是類構(gòu)造函數(shù),其余三種為工廠函數(shù)。工廠函數(shù)是指接受參數(shù)輸入并返回特定類型對(duì)象的函數(shù),其允許更多的動(dòng)態(tài)對(duì)象創(chuàng)建,有更多的配置參數(shù)。通常情況下更傾向于選擇工廠函數(shù)。
import torch import numpy as np t = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(torch.Tensor(t)) # 類構(gòu)造函數(shù) print(torch.tensor(t)) # 工廠函數(shù) print(torch.as_tensor(t)) # 工廠函數(shù) print(torch.from_numpy(t)) # 工廠函數(shù)
輸出結(jié)果如下:
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
二、4種方法的區(qū)別
1、數(shù)據(jù)類型
import torch import numpy as np data = np.array([1,2,3]) t1 = torch.Tensor(data) print(t1) print(t1.dtype) t2 = torch.tensor(data) print(t2) print(t2.dtype) t3 = torch.as_tensor(data) print(t3) print(t3.dtype) t4 = torch.from_numpy(data) print(t4) print(t4.dtype)
輸出結(jié)果如下:
tensor([1., 2., 3.])
torch.float32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
可以看出,構(gòu)造函數(shù)torch.Tensor()輸出的數(shù)據(jù)類型與其它三種方法不同,其主要原因是:構(gòu)造函數(shù)在構(gòu)造一個(gè)張量時(shí)使用全局缺省值,而工廠函數(shù)通過輸入數(shù)據(jù)的類型來推斷輸出數(shù)據(jù)的類型。我們可以使用如下代碼查看全局缺省值的數(shù)據(jù)類型。
d = torch.get_default_dtype() print(d)
輸出結(jié)果為:
torch.float32
所以,構(gòu)造函數(shù)torch.Tensor()輸出的數(shù)據(jù)類型為torch.float32。而工廠函數(shù)可以顯示指定數(shù)據(jù)類型,如下所示。
t = torch.tensor(np.array([1,2,3]), dtype=torch.float64) print(t)
輸出結(jié)果為:
tensor([1., 2., 3.], dtype=torch.float64)
2、數(shù)據(jù)內(nèi)存分配方式
import torch import numpy as np data = np.array([1,2,3]) print(data) t1 = torch.Tensor(data) t2 = torch.tensor(data) t3 = torch.as_tensor(data) t4 = torch.from_numpy(data) data[0] = 0 data[1] = 0 data[2] = 0 # t1 和 t2 輸出的都是更改前的數(shù)組 print(t1) print(t2) # t3 和 t4 輸出的都是更改后的數(shù)組 print(t3) print(t4)
輸出結(jié)果為:
[1 2 3]
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
上述差異是由創(chuàng)建時(shí)分配內(nèi)存的方式造成的:torch.Tensor()和torch.tensor()的方式是將數(shù)組中的元素值直接拷貝到張量中,改變data中的元素值并不會(huì)影響到t1和t2中的值;torch.as_tensor()和torch.from_numpy()的方式是與data數(shù)組共享數(shù)據(jù)。(可將t1和t2的方式看作"值傳遞";t3和t4的方式看作“地址傳遞”)。數(shù)據(jù)共享比數(shù)據(jù)拷貝更高效,更節(jié)省內(nèi)存空間。
共享數(shù)據(jù) | 拷貝數(shù)據(jù) |
torch.as_tensor() | torch.tensor() |
torch.from_numpy() | torch.Tensor() |
三、最優(yōu)的數(shù)據(jù)轉(zhuǎn)換方法
1、數(shù)據(jù)拷貝方式的最優(yōu)選擇是 torch.tensor() (因?yàn)槭枪S函數(shù));
2、內(nèi)存共享方式的最優(yōu)選擇是 torch.as_tensor() (因?yàn)閠orch.as_tensor可以接受任何python數(shù)據(jù)結(jié)構(gòu);而torch.from_numpy只接受numpy數(shù)組);
3、數(shù)據(jù)拷貝的方式更注重實(shí)現(xiàn);而內(nèi)存共享的方式更注重代碼性能,日常使用時(shí)不注重性能的話選擇torch.tensor()即可。
四、使用內(nèi)存共享函數(shù)的注意事項(xiàng)
1、由于numpy.ndaaray對(duì)象分配在CPU上,所以如果使用GPU的話,torch.as_tensor函數(shù)必須把數(shù)據(jù)從CPU上拷到GPU上;
2.、as_tensor()對(duì)于python內(nèi)置的數(shù)據(jù)結(jié)構(gòu),如列表,是無效的;
3、as_tensor的調(diào)用要求熟悉共享特征,以免對(duì)底層數(shù)據(jù)做不必要的更改,而影響到對(duì)象;
4、當(dāng)as_tensor和numpy.ndarray有大量的相互往返的操作時(shí),對(duì)性能的提升會(huì)有較大的影響。
到此這篇關(guān)于Pytorch創(chuàng)建張量的四種方法的文章就介紹到這了,更多相關(guān)Pytorch創(chuàng)建張量內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?pandas找出、刪除重復(fù)的數(shù)據(jù)實(shí)例
在面試中很可能遇到給定一個(gè)含有重復(fù)元素的列表,刪除其中重復(fù)的元素,下面這篇文章主要給大家介紹了關(guān)于Python?pandas找出、刪除重復(fù)數(shù)據(jù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07利用Python實(shí)現(xiàn)Json序列化庫的方法步驟
這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)Json序列化庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python headers請(qǐng)求頭如何實(shí)現(xiàn)快速添加
這篇文章主要介紹了Python headers請(qǐng)求頭如何實(shí)現(xiàn)快速添加,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11使用Python寫一個(gè)創(chuàng)意五子棋游戲源代碼
這篇文章主要給大家介紹了關(guān)于使用Python寫一個(gè)創(chuàng)意五子棋游戲的相關(guān)資料,Python作為一種簡單易上手的編程語言,能夠輕松實(shí)現(xiàn)五子棋游戲,需要的朋友可以參考下2023-08-08pytorch多GPU并行運(yùn)算的實(shí)現(xiàn)
這篇文章主要介紹了pytorch多GPU并行運(yùn)算的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09通過數(shù)據(jù)庫向Django模型添加字段的示例
這篇文章主要介紹了通過數(shù)據(jù)庫向Django模型添加字段的示例,Django是人氣最高的Python web開發(fā)框架,需要的朋友可以參考下2015-07-07Python selenium模擬網(wǎng)頁點(diǎn)擊爬蟲交管12123違章數(shù)據(jù)
本次介紹怎么以模擬點(diǎn)擊方式進(jìn)入交管12123爬取車輛違章數(shù)據(jù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05python實(shí)現(xiàn)簡單聊天室功能 可以私聊
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單聊天室功能,可以進(jìn)行私聊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07使用Python防止SQL注入攻擊的實(shí)現(xiàn)示例
這篇文章主要介紹了使用Python防止SQL注入攻擊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05