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ù)輸入并返回特定類型對象的函數(shù),其允許更多的動態(tài)對象創(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)造一個張量時使用全局缺省值,而工廠函數(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)建時分配內(nèi)存的方式造成的:torch.Tensor()和torch.tensor()的方式是將數(shù)組中的元素值直接拷貝到張量中,改變data中的元素值并不會影響到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)存共享的方式更注重代碼性能,日常使用時不注重性能的話選擇torch.tensor()即可。
四、使用內(nèi)存共享函數(shù)的注意事項(xiàng)
1、由于numpy.ndaaray對象分配在CPU上,所以如果使用GPU的話,torch.as_tensor函數(shù)必須把數(shù)據(jù)從CPU上拷到GPU上;
2.、as_tensor()對于python內(nèi)置的數(shù)據(jù)結(jié)構(gòu),如列表,是無效的;
3、as_tensor的調(diào)用要求熟悉共享特征,以免對底層數(shù)據(jù)做不必要的更改,而影響到對象;
4、當(dāng)as_tensor和numpy.ndarray有大量的相互往返的操作時,對性能的提升會有較大的影響。
到此這篇關(guān)于Pytorch創(chuàng)建張量的四種方法的文章就介紹到這了,更多相關(guān)Pytorch創(chuàng)建張量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python requests庫發(fā)送JSON數(shù)據(jù)的POST請求步驟
在Python這個強(qiáng)大的編程語言中,requests庫是一個廣泛使用且功能強(qiáng)大的HTTP請求庫,發(fā)送POST請求并附帶JSON數(shù)據(jù)是一個非常常見的需求,本文給大家介紹了如何用Python的requests庫發(fā)送JSON數(shù)據(jù)的POST請求,需要的朋友可以參考下2024-06-06
Python?正則表達(dá)式基礎(chǔ)知識點(diǎn)及實(shí)例
在本篇文章里小編給大家整理了關(guān)于Python正則表達(dá)式的一些基礎(chǔ)知識點(diǎn)以及相關(guān)用法實(shí)例內(nèi)容,需要的朋友們可以參考下。2021-12-12
詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式
這篇文章主要介紹了詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python獲取的html中都是\\u003e實(shí)現(xiàn)轉(zhuǎn)成正確字符
這篇文章主要介紹了python獲取的html中都是\\u003e實(shí)現(xiàn)轉(zhuǎn)成正確字符方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
python函數(shù)裝飾器構(gòu)造和參數(shù)傳遞
這篇文章主要介紹了python函數(shù)裝飾器構(gòu)造和參數(shù)傳遞,下面通過一個小案例來簡單的理解什么是裝飾器,需要的小伙伴可以參考一下2022-03-03
python畫圖時linestyle,color和loc參數(shù)的設(shè)置方式
這篇文章主要介紹了python畫圖時linestyle,color和loc參數(shù)的設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

